From 09542c772879efddf09312ebdc2d019a9d62c486 Mon Sep 17 00:00:00 2001 From: Andrew Martinez Date: Fri, 23 Feb 2024 14:42:12 -0500 Subject: [PATCH 01/29] consolidated ha changes --- common/ctrl_msg/messages.go | 5 + common/event_cache.go | 243 + .../token.go => common/oidc_tokens.go | 98 +- common/pb/edge_cmd_pb/edge_cmd.pb.go | 1801 +++---- common/pb/edge_cmd_pb/edge_cmd.proto | 12 + common/pb/edge_ctrl_pb/README.md | 5 +- common/pb/edge_ctrl_pb/edge_ctrl.pb.go | 4361 +++++++++++------ common/pb/edge_ctrl_pb/edge_ctrl.proto | 173 +- common/pb/edge_ctrl_pb/headers.go | 3 - common/router_data_model.go | 586 +++ common/version/info_generated.go | 2 +- controller/apierror/helpers.go | 8 + controller/apierror/messages.go | 4 + controller/config/config.go | 6 +- controller/controller.go | 21 + controller/db/base_entity.go | 1 + controller/db/controller_store.go | 109 + controller/db/stores.go | 4 + controller/env/appenv.go | 183 +- controller/env/broker.go | 22 +- controller/env/sync.go | 11 +- controller/handler_edge_ctrl/common.go | 230 +- .../handler_edge_ctrl/create_circuit.go | 5 +- .../handler_edge_ctrl/create_terminator.go | 4 +- .../handler_edge_ctrl/create_terminator_v2.go | 4 +- .../create_tunnel_api_session.go | 2 +- .../create_tunnel_circuit.go | 2 +- .../create_tunnel_terminator.go | 3 +- controller/handler_edge_ctrl/health_event.go | 4 +- controller/handler_edge_ctrl/hello.go | 6 +- .../handler_edge_ctrl/list_tunnel_services.go | 2 +- .../handler_edge_ctrl/remove_terminator.go | 2 +- .../remove_tunnel_terminator.go | 2 +- .../handler_edge_ctrl/tunnel_health_event.go | 4 +- .../handler_edge_ctrl/update_terminator.go | 4 +- .../update_tunnel_terminator.go | 2 +- controller/internal/routes/ca_router.go | 6 +- .../internal/routes/controller_api_model.go | 49 + .../internal/routes/controller_router.go | 56 + .../routes/current_identity_router.go | 46 +- controller/internal/routes/service_router.go | 76 + controller/internal/routes/session_router.go | 47 +- controller/jwtsigner/jwt.go | 24 +- controller/model/api_session_manager.go | 14 + controller/model/controller_manager.go | 246 + controller/model/controller_model.go | 69 + controller/model/enrollment_model.go | 9 +- controller/model/env.go | 12 +- controller/model/managers.go | 2 + controller/model/mfa_manager.go | 42 + controller/model/service_policy_manager.go | 15 + controller/model/session_manager.go | 59 + controller/model/testing.go | 51 +- controller/oidc_auth/client.go | 10 + controller/oidc_auth/config.go | 7 +- controller/oidc_auth/ctx.go | 28 + controller/oidc_auth/errors.go | 13 + controller/oidc_auth/login.go | 197 +- controller/oidc_auth/negotiate.go | 71 + controller/oidc_auth/parse.go | 233 + controller/oidc_auth/parse_test.go | 89 + controller/oidc_auth/provider.go | 2 +- controller/oidc_auth/render.go | 102 + controller/oidc_auth/requests.go | 11 +- controller/oidc_auth/storage.go | 162 +- controller/response/context.go | 6 +- controller/response/responder.go | 105 +- controller/server/client-api.go | 7 +- controller/server/controller.go | 20 +- controller/server/oidc-api.go | 36 +- controller/sync_strats/rtx.go | 3 + controller/sync_strats/sync_instant.go | 1007 +++- doc/ha/ctrl1.yml | 1 + doc/ha/ctrl2.yml | 1 + doc/ha/ctrl3.yml | 1 + doc/ha/overview.md | 32 + etc/ctrl.with.edge.yml | 6 + router/config.go | 15 + router/debugops/debugops.go | 4 +- router/handler_edge_ctrl/apiSessionAdded.go | 6 +- router/handler_edge_ctrl/apiSessionRemoved.go | 6 +- router/handler_edge_ctrl/apiSessionUpdated.go | 6 +- router/handler_edge_ctrl/dataState.go | 43 + router/handler_edge_ctrl/dataStateEvent.go | 35 + router/handler_edge_ctrl/hello.go | 40 +- router/handler_edge_ctrl/sessionRemoved.go | 6 +- router/handler_edge_ctrl/signingCertAdded.go | 33 - router/internal/edgerouter/config.go | 31 + router/posture/access.go | 67 + router/posture/checks.go | 68 + router/posture/domain.go | 42 + router/posture/errors.go | 164 + router/posture/mac.go | 47 + router/posture/mfa.go | 79 + router/posture/os.go | 12 + router/posture/process.go | 184 + router/{fabric => state}/heartbeat.go | 22 +- router/{fabric => state}/manager.go | 364 +- router/xgress_edge/accept.go | 33 +- router/xgress_edge/connections.go | 89 +- router/xgress_edge/factory.go | 16 +- router/xgress_edge/listener.go | 102 +- router/xgress_edge_tunnel/factory.go | 6 +- router/xgress_edge_tunnel/tunneler.go | 6 +- tests/ats-ctrl.yml | 6 + tests/ats-edge.router.yml.json.gzip | Bin 0 -> 4119 bytes tests/auth_distributed_test.go | 218 + tests/context.go | 52 +- tests/data_flow_hs_rotating_test.go | 2 +- tests/identity_api_session_activity_test.go | 4 +- tests/sdk_auth_test.go | 62 +- tests/sdk_event_test.go | 28 +- ziti/cmd/agentcli/agent_controller_init.go | 4 +- .../create/config_templates/controller.yml | 16 +- ziti/cmd/create/create_config.go | 7 +- ziti/cmd/create/create_config_controller.go | 4 + .../create/create_config_controller_test.go | 3 +- ziti/cmd/edge/quickstart.go | 2 +- ziti/router/run.go | 4 +- 119 files changed, 9632 insertions(+), 3213 deletions(-) create mode 100644 common/event_cache.go rename controller/oidc_auth/token.go => common/oidc_tokens.go (60%) delete mode 100644 common/pb/edge_ctrl_pb/headers.go create mode 100644 common/router_data_model.go create mode 100644 controller/db/controller_store.go create mode 100644 controller/internal/routes/controller_api_model.go create mode 100644 controller/internal/routes/controller_router.go create mode 100644 controller/model/controller_manager.go create mode 100644 controller/model/controller_model.go create mode 100644 controller/oidc_auth/errors.go create mode 100644 controller/oidc_auth/negotiate.go create mode 100644 controller/oidc_auth/parse.go create mode 100644 controller/oidc_auth/parse_test.go create mode 100644 controller/oidc_auth/render.go create mode 100644 router/handler_edge_ctrl/dataState.go create mode 100644 router/handler_edge_ctrl/dataStateEvent.go delete mode 100644 router/handler_edge_ctrl/signingCertAdded.go create mode 100644 router/posture/access.go create mode 100644 router/posture/checks.go create mode 100644 router/posture/domain.go create mode 100644 router/posture/errors.go create mode 100644 router/posture/mac.go create mode 100644 router/posture/mfa.go create mode 100644 router/posture/os.go create mode 100644 router/posture/process.go rename router/{fabric => state}/heartbeat.go (79%) rename router/{fabric => state}/manager.go (58%) create mode 100644 tests/ats-edge.router.yml.json.gzip create mode 100644 tests/auth_distributed_test.go diff --git a/common/ctrl_msg/messages.go b/common/ctrl_msg/messages.go index 2b7191c44..dfd38ce30 100644 --- a/common/ctrl_msg/messages.go +++ b/common/ctrl_msg/messages.go @@ -83,12 +83,17 @@ func NewRouteResultFailedMessage(sessionId string, attempt int, rerr string) *ch } type CreateCircuitRequest struct { + ApiSessionToken string SessionToken string Fingerprints []string TerminatorInstanceId string PeerData map[uint32][]byte } +func (self *CreateCircuitRequest) GetApiSessionToken() string { + return self.ApiSessionToken +} + func (self *CreateCircuitRequest) GetSessionToken() string { return self.SessionToken } diff --git a/common/event_cache.go b/common/event_cache.go new file mode 100644 index 000000000..ff9c9d0bc --- /dev/null +++ b/common/event_cache.go @@ -0,0 +1,243 @@ +package common + +import ( + "fmt" + "github.com/openziti/ziti/common/pb/edge_ctrl_pb" + "sync" +) + +type OnStoreSuccess func(index uint64, event *edge_ctrl_pb.DataState_Event) + +type EventCache interface { + // Store allows storage of an event and execution of an onSuccess callback while the event cache remains locked. + // onSuccess may be nil. This function is blocking. + Store(event *edge_ctrl_pb.DataState_Event, onSuccess OnStoreSuccess) error + + // CurrentIndex returns the latest event index applied. This function is blocking. + CurrentIndex() (uint64, bool) + + // ReplayFrom returns an array of events from startIndex and true if the replay may be facilitated. + // An empty slice and true is returned in cases where the requested startIndex is the current index. + // An empty slice and false is returned in cases where the replay cannot be facilitated. + // This function is blocking. + ReplayFrom(startIndex uint64) ([]*edge_ctrl_pb.DataState_Event, bool) + + // WhileLocked allows the execution of arbitrary functionality while the event cache is locked. This function + // is blocking. + WhileLocked(func(uint64, bool)) + + // SetCurrentIndex sets the current index to the supplied value. All event log history may be lost. + SetCurrentIndex(uint64) +} + +// ForgetfulEventCache does not store events or support replaying. It tracks +// the event index and that is it. It is a stand in for LoggingEventCache +// when replaying events is not expected (i.e. in routers) +type ForgetfulEventCache struct { + lock sync.Mutex + index *uint64 +} + +func NewForgetfulEventCache() *ForgetfulEventCache { + return &ForgetfulEventCache{} +} + +func (cache *ForgetfulEventCache) SetCurrentIndex(index uint64) { + cache.index = &index +} + +func (cache *ForgetfulEventCache) WhileLocked(callback func(uint64, bool)) { + cache.lock.Lock() + defer cache.lock.Unlock() + + callback(cache.currentIndex()) +} + +func (cache *ForgetfulEventCache) Store(event *edge_ctrl_pb.DataState_Event, onSuccess OnStoreSuccess) error { + cache.lock.Lock() + defer cache.lock.Unlock() + + // Synthetic events are not backed by any kind of data store that provides and index. They are not stored and + // trigger the on success callback immediately. + if event.IsSynthetic { + onSuccess(event.Index, event) + return nil + } + + if cache.index != nil { + if *cache.index >= event.Index { + //already past this index + return nil + } + + if *cache.index >= event.Index { + return fmt.Errorf("out of order event detected, currentIndex: %d, recievedIndex: %d, type :%T", *cache.index, event.Index, cache) + } + } + + cache.index = &event.Index + + if onSuccess != nil { + onSuccess(*cache.index, event) + } + + return nil +} + +func (cache *ForgetfulEventCache) ReplayFrom(_ uint64) ([]*edge_ctrl_pb.DataState_Event, bool) { + return nil, false +} + +func NewLoggingEventCache(logSize uint64) *LoggingEventCache { + return &LoggingEventCache{ + HeadLogIndex: 0, + LogSize: logSize, + Log: make([]uint64, logSize), + Events: map[uint64]*edge_ctrl_pb.DataState_Event{}, + } +} + +func (cache *LoggingEventCache) WhileLocked(callback func(uint64, bool)) { + cache.lock.Lock() + defer cache.lock.Unlock() + + callback(cache.currentIndex()) +} + +func (cache *ForgetfulEventCache) CurrentIndex() (uint64, bool) { + cache.lock.Lock() + defer cache.lock.Unlock() + + return cache.currentIndex() +} + +func (cache *ForgetfulEventCache) currentIndex() (uint64, bool) { + if cache.index == nil { + return 0, false + } + + return *cache.index, true +} + +// LoggingEventCache stores events in order to support replaying (i.e. in controllers). +type LoggingEventCache struct { + lock sync.Mutex + HeadLogIndex uint64 + LogSize uint64 + Log []uint64 + Events map[uint64]*edge_ctrl_pb.DataState_Event +} + +func (cache *LoggingEventCache) SetCurrentIndex(index uint64) { + cache.lock.Lock() + defer cache.lock.Unlock() + + cache.HeadLogIndex = 0 + cache.Log = make([]uint64, cache.LogSize) + cache.Log[0] = index + cache.Events = map[uint64]*edge_ctrl_pb.DataState_Event{} +} + +func (cache *LoggingEventCache) Store(event *edge_ctrl_pb.DataState_Event, onSuccess OnStoreSuccess) error { + cache.lock.Lock() + defer cache.lock.Unlock() + + // Synthetic events are not backed by any kind of data store that provides and index. They are not stored and + // trigger the on success callback immediately. + if event.IsSynthetic { + onSuccess(event.Index, event) + return nil + } + + currentIndex, ok := cache.currentIndex() + + if ok && currentIndex >= event.Index { + return fmt.Errorf("out of order event detected, currentIndex: %d, recievedIndex: %d, type :%T", currentIndex, event.Index, cache) + } + + targetLogIndex := uint64(0) + targetLogIndex = (cache.HeadLogIndex + 1) % cache.LogSize + + // delete old value if we have looped + prevKey := cache.Log[targetLogIndex] + + if prevKey != 0 { + delete(cache.Events, prevKey) + } + + // add new values + cache.Log[targetLogIndex] = event.Index + cache.Events[event.Index] = event + + //update head + cache.HeadLogIndex = targetLogIndex + + onSuccess(event.Index, event) + return nil +} + +func (cache *LoggingEventCache) CurrentIndex() (uint64, bool) { + cache.lock.Lock() + defer cache.lock.Unlock() + + return cache.currentIndex() +} + +func (cache *LoggingEventCache) currentIndex() (uint64, bool) { + if len(cache.Log) == 0 { + return 0, false + } + + return cache.Log[cache.HeadLogIndex], true +} + +func (cache *LoggingEventCache) ReplayFrom(startIndex uint64) ([]*edge_ctrl_pb.DataState_Event, bool) { + cache.lock.Lock() + defer cache.lock.Unlock() + + _, eventFound := cache.Events[startIndex] + + if !eventFound { + return nil, false + } + + var startLogIndex *uint64 + + for logIndex, eventIndex := range cache.Log { + if eventIndex == startIndex { + tmp := uint64(logIndex) + startLogIndex = &tmp + break + } + } + + if startLogIndex == nil { + return nil, false + } + + // no replay + if *startLogIndex == cache.HeadLogIndex { + return nil, true + } + + // ez replay + if *startLogIndex < cache.HeadLogIndex { + var result []*edge_ctrl_pb.DataState_Event + for _, key := range cache.Log[*startLogIndex:cache.HeadLogIndex] { + result = append(result, cache.Events[key]) + } + return result, true + } + + //looping replay + var result []*edge_ctrl_pb.DataState_Event + for _, key := range cache.Log[*startLogIndex:] { + result = append(result, cache.Events[key]) + } + + for _, key := range cache.Log[0:cache.HeadLogIndex] { + result = append(result, cache.Events[key]) + } + + return result, true +} diff --git a/controller/oidc_auth/token.go b/common/oidc_tokens.go similarity index 60% rename from controller/oidc_auth/token.go rename to common/oidc_tokens.go index 112c10a03..20ae55003 100644 --- a/controller/oidc_auth/token.go +++ b/common/oidc_tokens.go @@ -1,9 +1,10 @@ -package oidc_auth +package common import ( "encoding/json" "fmt" "github.com/golang-jwt/jwt/v5" + "github.com/openziti/edge-api/rest_model" "github.com/zitadel/oidc/v2/pkg/oidc" "time" ) @@ -17,23 +18,51 @@ const ( CustomClaimsConfigTypes = "z_ct" CustomClaimsCertFingerprints = "z_cfs" + // CustomClaimsTokenType and other constants below may not appear as referenced, but are used in `json: ""` tags. Provided here for external use. + CustomClaimsTokenType = "z_t" + CustomClaimServiceId = "z_sid" + CustomClaimIdentityId = "z_iid" + CustomClaimServiceType = "z_st" + CustomClaimRemoteAddress = "z_ra" + DefaultAccessTokenDuration = 30 * time.Minute DefaultIdTokenDuration = 30 * time.Minute DefaultRefreshTokenDuration = 24 * time.Hour - TokenTypeAccess = "a" - TokenTypeRefresh = "r" + TokenTypeAccess = "a" + TokenTypeRefresh = "r" + TokenTypeServiceAccess = "s" ) type CustomClaims struct { - ApiSessionId string `json:"z_asid,omitempty"` - ExternalId string `json:"z_eid,omitempty"` - IsAdmin bool `json:"z_ia,omitempty"` - ConfigTypes []string `json:"z_ct,omitempty"` - ApplicationId string `json:"z_aid,omitempty"` - Type string `json:"z_t"` - CertFingerprints []string `json:"z_cfs"` - Scopes []string `json:"scopes,omitempty"` + ApiSessionId string `json:"z_asid,omitempty"` + ExternalId string `json:"z_eid,omitempty"` + IsAdmin bool `json:"z_ia,omitempty"` + ConfigTypes []string `json:"z_ct,omitempty"` + ApplicationId string `json:"z_aid,omitempty"` + Type string `json:"z_t"` + CertFingerprints []string `json:"z_cfs"` + Scopes []string `json:"scopes,omitempty"` + SdkInfo *rest_model.SdkInfo `json:"z_sdk"` + EnvInfo *rest_model.EnvInfo `json:"z_env"` + RemoteAddress string `json:"z_ra"` +} + +func (c *CustomClaims) ToMap() (map[string]any, error) { + out := map[string]any{} + str, err := json.Marshal(c) + + if err != nil { + return nil, err + } + + err = json.Unmarshal(str, &out) + + if err != nil { + return nil, err + } + + return out, nil } type RefreshClaims struct { @@ -99,11 +128,49 @@ func (c *RefreshClaims) UnmarshalJSON(data []byte) error { return nil } +type ServiceAccessClaims struct { + jwt.RegisteredClaims + ApiSessionId string `json:"z_asid"` + IdentityId string `json:"z_iid"` + TokenType string `json:"z_t"` + Type string `json:"z_st"` +} + +func (c *ServiceAccessClaims) HasAudience(targetAud string) bool { + for _, aud := range c.Audience { + if aud == targetAud { + return true + } + } + return false +} + type AccessClaims struct { oidc.AccessTokenClaims CustomClaims } +func (r *AccessClaims) ConfigTypesAsMap() map[string]struct{} { + result := map[string]struct{}{} + + for _, configType := range r.ConfigTypes { + result[configType] = struct{}{} + } + + return result +} + +func (r *AccessClaims) UnmarshalJSON(raw []byte) error { + err := json.Unmarshal(raw, &r.AccessTokenClaims) + if err != nil { + return err + } + + err = json.Unmarshal(raw, &r.CustomClaims) + + return err +} + func (r *AccessClaims) GetExpirationTime() (*jwt.NumericDate, error) { return &jwt.NumericDate{Time: r.TokenClaims.GetExpiration()}, nil } @@ -139,6 +206,15 @@ func (c *AccessClaims) TotpComplete() bool { return false } +func (c *AccessClaims) HasAudience(targetAud string) bool { + for _, aud := range c.Audience { + if aud == targetAud { + return true + } + } + return false +} + type IdTokenClaims struct { oidc.IDTokenClaims CustomClaims diff --git a/common/pb/edge_cmd_pb/edge_cmd.pb.go b/common/pb/edge_cmd_pb/edge_cmd.pb.go index 3918f58a1..48d917c08 100644 --- a/common/pb/edge_cmd_pb/edge_cmd.pb.go +++ b/common/pb/edge_cmd_pb/edge_cmd.pb.go @@ -1031,6 +1031,110 @@ func (x *ConfigType) GetTags() map[string]*TagValue { return nil } +// Controllers +type Controller struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Address string `protobuf:"bytes,3,opt,name=address,proto3" json:"address,omitempty"` + CertPem string `protobuf:"bytes,4,opt,name=certPem,proto3" json:"certPem,omitempty"` + Fingerprint string `protobuf:"bytes,5,opt,name=fingerprint,proto3" json:"fingerprint,omitempty"` + IsOnline bool `protobuf:"varint,6,opt,name=isOnline,proto3" json:"isOnline,omitempty"` + LastJoinedAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=lastJoinedAt,proto3" json:"lastJoinedAt,omitempty"` + Tags map[string]*TagValue `protobuf:"bytes,8,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *Controller) Reset() { + *x = Controller{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_cmd_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Controller) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Controller) ProtoMessage() {} + +func (x *Controller) ProtoReflect() protoreflect.Message { + mi := &file_edge_cmd_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Controller.ProtoReflect.Descriptor instead. +func (*Controller) Descriptor() ([]byte, []int) { + return file_edge_cmd_proto_rawDescGZIP(), []int{11} +} + +func (x *Controller) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *Controller) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Controller) GetAddress() string { + if x != nil { + return x.Address + } + return "" +} + +func (x *Controller) GetCertPem() string { + if x != nil { + return x.CertPem + } + return "" +} + +func (x *Controller) GetFingerprint() string { + if x != nil { + return x.Fingerprint + } + return "" +} + +func (x *Controller) GetIsOnline() bool { + if x != nil { + return x.IsOnline + } + return false +} + +func (x *Controller) GetLastJoinedAt() *timestamppb.Timestamp { + if x != nil { + return x.LastJoinedAt + } + return nil +} + +func (x *Controller) GetTags() map[string]*TagValue { + if x != nil { + return x.Tags + } + return nil +} + // Edge Routers type EdgeRouter struct { state protoimpl.MessageState @@ -1057,7 +1161,7 @@ type EdgeRouter struct { func (x *EdgeRouter) Reset() { *x = EdgeRouter{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[11] + mi := &file_edge_cmd_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1070,7 +1174,7 @@ func (x *EdgeRouter) String() string { func (*EdgeRouter) ProtoMessage() {} func (x *EdgeRouter) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[11] + mi := &file_edge_cmd_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1083,7 +1187,7 @@ func (x *EdgeRouter) ProtoReflect() protoreflect.Message { // Deprecated: Use EdgeRouter.ProtoReflect.Descriptor instead. func (*EdgeRouter) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{11} + return file_edge_cmd_proto_rawDescGZIP(), []int{12} } func (x *EdgeRouter) GetId() string { @@ -1203,7 +1307,7 @@ type ReEnrollEdgeRouterCmd struct { func (x *ReEnrollEdgeRouterCmd) Reset() { *x = ReEnrollEdgeRouterCmd{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[12] + mi := &file_edge_cmd_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1216,7 +1320,7 @@ func (x *ReEnrollEdgeRouterCmd) String() string { func (*ReEnrollEdgeRouterCmd) ProtoMessage() {} func (x *ReEnrollEdgeRouterCmd) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[12] + mi := &file_edge_cmd_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1229,7 +1333,7 @@ func (x *ReEnrollEdgeRouterCmd) ProtoReflect() protoreflect.Message { // Deprecated: Use ReEnrollEdgeRouterCmd.ProtoReflect.Descriptor instead. func (*ReEnrollEdgeRouterCmd) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{12} + return file_edge_cmd_proto_rawDescGZIP(), []int{13} } func (x *ReEnrollEdgeRouterCmd) GetEdgeRouterId() string { @@ -1259,7 +1363,7 @@ type CreateEdgeRouterCmd struct { func (x *CreateEdgeRouterCmd) Reset() { *x = CreateEdgeRouterCmd{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[13] + mi := &file_edge_cmd_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1272,7 +1376,7 @@ func (x *CreateEdgeRouterCmd) String() string { func (*CreateEdgeRouterCmd) ProtoMessage() {} func (x *CreateEdgeRouterCmd) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[13] + mi := &file_edge_cmd_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1285,7 +1389,7 @@ func (x *CreateEdgeRouterCmd) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateEdgeRouterCmd.ProtoReflect.Descriptor instead. func (*CreateEdgeRouterCmd) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{13} + return file_edge_cmd_proto_rawDescGZIP(), []int{14} } func (x *CreateEdgeRouterCmd) GetEdgeRouter() *EdgeRouter { @@ -1326,7 +1430,7 @@ type EdgeRouterPolicy struct { func (x *EdgeRouterPolicy) Reset() { *x = EdgeRouterPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[14] + mi := &file_edge_cmd_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1339,7 +1443,7 @@ func (x *EdgeRouterPolicy) String() string { func (*EdgeRouterPolicy) ProtoMessage() {} func (x *EdgeRouterPolicy) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[14] + mi := &file_edge_cmd_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1352,7 +1456,7 @@ func (x *EdgeRouterPolicy) ProtoReflect() protoreflect.Message { // Deprecated: Use EdgeRouterPolicy.ProtoReflect.Descriptor instead. func (*EdgeRouterPolicy) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{14} + return file_edge_cmd_proto_rawDescGZIP(), []int{15} } func (x *EdgeRouterPolicy) GetId() string { @@ -1420,7 +1524,7 @@ type Enrollment struct { func (x *Enrollment) Reset() { *x = Enrollment{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[15] + mi := &file_edge_cmd_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1433,7 +1537,7 @@ func (x *Enrollment) String() string { func (*Enrollment) ProtoMessage() {} func (x *Enrollment) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[15] + mi := &file_edge_cmd_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1446,7 +1550,7 @@ func (x *Enrollment) ProtoReflect() protoreflect.Message { // Deprecated: Use Enrollment.ProtoReflect.Descriptor instead. func (*Enrollment) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{15} + return file_edge_cmd_proto_rawDescGZIP(), []int{16} } func (x *Enrollment) GetId() string { @@ -1546,7 +1650,7 @@ type ReplaceEnrollmentWithAuthenticatorCmd struct { func (x *ReplaceEnrollmentWithAuthenticatorCmd) Reset() { *x = ReplaceEnrollmentWithAuthenticatorCmd{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[16] + mi := &file_edge_cmd_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1559,7 +1663,7 @@ func (x *ReplaceEnrollmentWithAuthenticatorCmd) String() string { func (*ReplaceEnrollmentWithAuthenticatorCmd) ProtoMessage() {} func (x *ReplaceEnrollmentWithAuthenticatorCmd) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[16] + mi := &file_edge_cmd_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1572,7 +1676,7 @@ func (x *ReplaceEnrollmentWithAuthenticatorCmd) ProtoReflect() protoreflect.Mess // Deprecated: Use ReplaceEnrollmentWithAuthenticatorCmd.ProtoReflect.Descriptor instead. func (*ReplaceEnrollmentWithAuthenticatorCmd) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{16} + return file_edge_cmd_proto_rawDescGZIP(), []int{17} } func (x *ReplaceEnrollmentWithAuthenticatorCmd) GetEnrollmentId() string { @@ -1623,7 +1727,7 @@ type ExternalJwtSigner struct { func (x *ExternalJwtSigner) Reset() { *x = ExternalJwtSigner{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[17] + mi := &file_edge_cmd_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1636,7 +1740,7 @@ func (x *ExternalJwtSigner) String() string { func (*ExternalJwtSigner) ProtoMessage() {} func (x *ExternalJwtSigner) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[17] + mi := &file_edge_cmd_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1649,7 +1753,7 @@ func (x *ExternalJwtSigner) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalJwtSigner.ProtoReflect.Descriptor instead. func (*ExternalJwtSigner) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{17} + return file_edge_cmd_proto_rawDescGZIP(), []int{18} } func (x *ExternalJwtSigner) GetId() string { @@ -1794,7 +1898,7 @@ type Identity struct { func (x *Identity) Reset() { *x = Identity{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[18] + mi := &file_edge_cmd_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1807,7 +1911,7 @@ func (x *Identity) String() string { func (*Identity) ProtoMessage() {} func (x *Identity) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[18] + mi := &file_edge_cmd_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1820,7 +1924,7 @@ func (x *Identity) ProtoReflect() protoreflect.Message { // Deprecated: Use Identity.ProtoReflect.Descriptor instead. func (*Identity) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{18} + return file_edge_cmd_proto_rawDescGZIP(), []int{19} } func (x *Identity) GetId() string { @@ -1969,7 +2073,7 @@ type CreateIdentityWithEnrollmentsCmd struct { func (x *CreateIdentityWithEnrollmentsCmd) Reset() { *x = CreateIdentityWithEnrollmentsCmd{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[19] + mi := &file_edge_cmd_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1982,7 +2086,7 @@ func (x *CreateIdentityWithEnrollmentsCmd) String() string { func (*CreateIdentityWithEnrollmentsCmd) ProtoMessage() {} func (x *CreateIdentityWithEnrollmentsCmd) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[19] + mi := &file_edge_cmd_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1995,7 +2099,7 @@ func (x *CreateIdentityWithEnrollmentsCmd) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateIdentityWithEnrollmentsCmd.ProtoReflect.Descriptor instead. func (*CreateIdentityWithEnrollmentsCmd) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{19} + return file_edge_cmd_proto_rawDescGZIP(), []int{20} } func (x *CreateIdentityWithEnrollmentsCmd) GetIdentity() *Identity { @@ -2036,7 +2140,7 @@ type Mfa struct { func (x *Mfa) Reset() { *x = Mfa{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[20] + mi := &file_edge_cmd_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2049,7 +2153,7 @@ func (x *Mfa) String() string { func (*Mfa) ProtoMessage() {} func (x *Mfa) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[20] + mi := &file_edge_cmd_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2062,7 +2166,7 @@ func (x *Mfa) ProtoReflect() protoreflect.Message { // Deprecated: Use Mfa.ProtoReflect.Descriptor instead. func (*Mfa) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{20} + return file_edge_cmd_proto_rawDescGZIP(), []int{21} } func (x *Mfa) GetId() string { @@ -2132,7 +2236,7 @@ type PostureCheck struct { func (x *PostureCheck) Reset() { *x = PostureCheck{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[21] + mi := &file_edge_cmd_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2145,7 +2249,7 @@ func (x *PostureCheck) String() string { func (*PostureCheck) ProtoMessage() {} func (x *PostureCheck) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[21] + mi := &file_edge_cmd_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2158,7 +2262,7 @@ func (x *PostureCheck) ProtoReflect() protoreflect.Message { // Deprecated: Use PostureCheck.ProtoReflect.Descriptor instead. func (*PostureCheck) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{21} + return file_edge_cmd_proto_rawDescGZIP(), []int{22} } func (x *PostureCheck) GetId() string { @@ -2305,7 +2409,7 @@ type Revocation struct { func (x *Revocation) Reset() { *x = Revocation{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[22] + mi := &file_edge_cmd_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2318,7 +2422,7 @@ func (x *Revocation) String() string { func (*Revocation) ProtoMessage() {} func (x *Revocation) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[22] + mi := &file_edge_cmd_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2331,7 +2435,7 @@ func (x *Revocation) ProtoReflect() protoreflect.Message { // Deprecated: Use Revocation.ProtoReflect.Descriptor instead. func (*Revocation) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{22} + return file_edge_cmd_proto_rawDescGZIP(), []int{23} } func (x *Revocation) GetId() string { @@ -2374,7 +2478,7 @@ type Service struct { func (x *Service) Reset() { *x = Service{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[23] + mi := &file_edge_cmd_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2387,7 +2491,7 @@ func (x *Service) String() string { func (*Service) ProtoMessage() {} func (x *Service) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[23] + mi := &file_edge_cmd_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2400,7 +2504,7 @@ func (x *Service) ProtoReflect() protoreflect.Message { // Deprecated: Use Service.ProtoReflect.Descriptor instead. func (*Service) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{23} + return file_edge_cmd_proto_rawDescGZIP(), []int{24} } func (x *Service) GetId() string { @@ -2476,7 +2580,7 @@ type ServiceEdgeRouterPolicy struct { func (x *ServiceEdgeRouterPolicy) Reset() { *x = ServiceEdgeRouterPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[24] + mi := &file_edge_cmd_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2489,7 +2593,7 @@ func (x *ServiceEdgeRouterPolicy) String() string { func (*ServiceEdgeRouterPolicy) ProtoMessage() {} func (x *ServiceEdgeRouterPolicy) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[24] + mi := &file_edge_cmd_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2502,7 +2606,7 @@ func (x *ServiceEdgeRouterPolicy) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceEdgeRouterPolicy.ProtoReflect.Descriptor instead. func (*ServiceEdgeRouterPolicy) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{24} + return file_edge_cmd_proto_rawDescGZIP(), []int{25} } func (x *ServiceEdgeRouterPolicy) GetId() string { @@ -2566,7 +2670,7 @@ type ServicePolicy struct { func (x *ServicePolicy) Reset() { *x = ServicePolicy{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[25] + mi := &file_edge_cmd_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2579,7 +2683,7 @@ func (x *ServicePolicy) String() string { func (*ServicePolicy) ProtoMessage() {} func (x *ServicePolicy) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[25] + mi := &file_edge_cmd_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2592,7 +2696,7 @@ func (x *ServicePolicy) ProtoReflect() protoreflect.Message { // Deprecated: Use ServicePolicy.ProtoReflect.Descriptor instead. func (*ServicePolicy) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{25} + return file_edge_cmd_proto_rawDescGZIP(), []int{26} } func (x *ServicePolicy) GetId() string { @@ -2672,7 +2776,7 @@ type TransitRouter struct { func (x *TransitRouter) Reset() { *x = TransitRouter{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[26] + mi := &file_edge_cmd_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2685,7 +2789,7 @@ func (x *TransitRouter) String() string { func (*TransitRouter) ProtoMessage() {} func (x *TransitRouter) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[26] + mi := &file_edge_cmd_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2698,7 +2802,7 @@ func (x *TransitRouter) ProtoReflect() protoreflect.Message { // Deprecated: Use TransitRouter.ProtoReflect.Descriptor instead. func (*TransitRouter) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{26} + return file_edge_cmd_proto_rawDescGZIP(), []int{27} } func (x *TransitRouter) GetId() string { @@ -2784,7 +2888,7 @@ type CreateTransitRouterCmd struct { func (x *CreateTransitRouterCmd) Reset() { *x = CreateTransitRouterCmd{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[27] + mi := &file_edge_cmd_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2797,7 +2901,7 @@ func (x *CreateTransitRouterCmd) String() string { func (*CreateTransitRouterCmd) ProtoMessage() {} func (x *CreateTransitRouterCmd) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[27] + mi := &file_edge_cmd_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2810,7 +2914,7 @@ func (x *CreateTransitRouterCmd) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTransitRouterCmd.ProtoReflect.Descriptor instead. func (*CreateTransitRouterCmd) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{27} + return file_edge_cmd_proto_rawDescGZIP(), []int{28} } func (x *CreateTransitRouterCmd) GetRouter() *TransitRouter { @@ -2848,7 +2952,7 @@ type UpdateServiceConfigsCmd struct { func (x *UpdateServiceConfigsCmd) Reset() { *x = UpdateServiceConfigsCmd{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[28] + mi := &file_edge_cmd_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2861,7 +2965,7 @@ func (x *UpdateServiceConfigsCmd) String() string { func (*UpdateServiceConfigsCmd) ProtoMessage() {} func (x *UpdateServiceConfigsCmd) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[28] + mi := &file_edge_cmd_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2874,7 +2978,7 @@ func (x *UpdateServiceConfigsCmd) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateServiceConfigsCmd.ProtoReflect.Descriptor instead. func (*UpdateServiceConfigsCmd) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{28} + return file_edge_cmd_proto_rawDescGZIP(), []int{29} } func (x *UpdateServiceConfigsCmd) GetIdentityId() string { @@ -2919,7 +3023,7 @@ type Authenticator_Cert struct { func (x *Authenticator_Cert) Reset() { *x = Authenticator_Cert{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[31] + mi := &file_edge_cmd_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2932,7 +3036,7 @@ func (x *Authenticator_Cert) String() string { func (*Authenticator_Cert) ProtoMessage() {} func (x *Authenticator_Cert) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[31] + mi := &file_edge_cmd_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2989,7 +3093,7 @@ type Authenticator_Updb struct { func (x *Authenticator_Updb) Reset() { *x = Authenticator_Updb{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[32] + mi := &file_edge_cmd_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3002,7 +3106,7 @@ func (x *Authenticator_Updb) String() string { func (*Authenticator_Updb) ProtoMessage() {} func (x *Authenticator_Updb) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[32] + mi := &file_edge_cmd_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3052,7 +3156,7 @@ type AuthPolicy_Primary struct { func (x *AuthPolicy_Primary) Reset() { *x = AuthPolicy_Primary{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[34] + mi := &file_edge_cmd_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3065,7 +3169,7 @@ func (x *AuthPolicy_Primary) String() string { func (*AuthPolicy_Primary) ProtoMessage() {} func (x *AuthPolicy_Primary) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[34] + mi := &file_edge_cmd_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3114,7 +3218,7 @@ type AuthPolicy_Secondary struct { func (x *AuthPolicy_Secondary) Reset() { *x = AuthPolicy_Secondary{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[35] + mi := &file_edge_cmd_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3127,7 +3231,7 @@ func (x *AuthPolicy_Secondary) String() string { func (*AuthPolicy_Secondary) ProtoMessage() {} func (x *AuthPolicy_Secondary) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[35] + mi := &file_edge_cmd_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3169,7 +3273,7 @@ type AuthPolicy_Primary_Cert struct { func (x *AuthPolicy_Primary_Cert) Reset() { *x = AuthPolicy_Primary_Cert{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[37] + mi := &file_edge_cmd_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3182,7 +3286,7 @@ func (x *AuthPolicy_Primary_Cert) String() string { func (*AuthPolicy_Primary_Cert) ProtoMessage() {} func (x *AuthPolicy_Primary_Cert) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[37] + mi := &file_edge_cmd_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3229,7 +3333,7 @@ type AuthPolicy_Primary_Updb struct { func (x *AuthPolicy_Primary_Updb) Reset() { *x = AuthPolicy_Primary_Updb{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[38] + mi := &file_edge_cmd_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3242,7 +3346,7 @@ func (x *AuthPolicy_Primary_Updb) String() string { func (*AuthPolicy_Primary_Updb) ProtoMessage() {} func (x *AuthPolicy_Primary_Updb) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[38] + mi := &file_edge_cmd_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3320,7 +3424,7 @@ type AuthPolicy_Primary_ExtJwt struct { func (x *AuthPolicy_Primary_ExtJwt) Reset() { *x = AuthPolicy_Primary_ExtJwt{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[39] + mi := &file_edge_cmd_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3333,7 +3437,7 @@ func (x *AuthPolicy_Primary_ExtJwt) String() string { func (*AuthPolicy_Primary_ExtJwt) ProtoMessage() {} func (x *AuthPolicy_Primary_ExtJwt) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[39] + mi := &file_edge_cmd_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3386,7 +3490,7 @@ type Ca_ExternalIdClaim struct { func (x *Ca_ExternalIdClaim) Reset() { *x = Ca_ExternalIdClaim{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[40] + mi := &file_edge_cmd_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3399,7 +3503,7 @@ func (x *Ca_ExternalIdClaim) String() string { func (*Ca_ExternalIdClaim) ProtoMessage() {} func (x *Ca_ExternalIdClaim) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[40] + mi := &file_edge_cmd_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3473,7 +3577,7 @@ type Identity_EnvInfo struct { func (x *Identity_EnvInfo) Reset() { *x = Identity_EnvInfo{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[48] + mi := &file_edge_cmd_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3486,7 +3590,7 @@ func (x *Identity_EnvInfo) String() string { func (*Identity_EnvInfo) ProtoMessage() {} func (x *Identity_EnvInfo) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[48] + mi := &file_edge_cmd_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3499,7 +3603,7 @@ func (x *Identity_EnvInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use Identity_EnvInfo.ProtoReflect.Descriptor instead. func (*Identity_EnvInfo) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{18, 0} + return file_edge_cmd_proto_rawDescGZIP(), []int{19, 0} } func (x *Identity_EnvInfo) GetArch() string { @@ -3560,7 +3664,7 @@ type Identity_SdkInfo struct { func (x *Identity_SdkInfo) Reset() { *x = Identity_SdkInfo{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[49] + mi := &file_edge_cmd_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3573,7 +3677,7 @@ func (x *Identity_SdkInfo) String() string { func (*Identity_SdkInfo) ProtoMessage() {} func (x *Identity_SdkInfo) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[49] + mi := &file_edge_cmd_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3586,7 +3690,7 @@ func (x *Identity_SdkInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use Identity_SdkInfo.ProtoReflect.Descriptor instead. func (*Identity_SdkInfo) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{18, 1} + return file_edge_cmd_proto_rawDescGZIP(), []int{19, 1} } func (x *Identity_SdkInfo) GetAppId() string { @@ -3642,7 +3746,7 @@ type PostureCheck_Mac struct { func (x *PostureCheck_Mac) Reset() { *x = PostureCheck_Mac{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[54] + mi := &file_edge_cmd_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3655,7 +3759,7 @@ func (x *PostureCheck_Mac) String() string { func (*PostureCheck_Mac) ProtoMessage() {} func (x *PostureCheck_Mac) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[54] + mi := &file_edge_cmd_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3668,7 +3772,7 @@ func (x *PostureCheck_Mac) ProtoReflect() protoreflect.Message { // Deprecated: Use PostureCheck_Mac.ProtoReflect.Descriptor instead. func (*PostureCheck_Mac) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{21, 0} + return file_edge_cmd_proto_rawDescGZIP(), []int{22, 0} } func (x *PostureCheck_Mac) GetMacAddresses() []string { @@ -3692,7 +3796,7 @@ type PostureCheck_Mfa struct { func (x *PostureCheck_Mfa) Reset() { *x = PostureCheck_Mfa{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[55] + mi := &file_edge_cmd_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3705,7 +3809,7 @@ func (x *PostureCheck_Mfa) String() string { func (*PostureCheck_Mfa) ProtoMessage() {} func (x *PostureCheck_Mfa) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[55] + mi := &file_edge_cmd_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3718,7 +3822,7 @@ func (x *PostureCheck_Mfa) ProtoReflect() protoreflect.Message { // Deprecated: Use PostureCheck_Mfa.ProtoReflect.Descriptor instead. func (*PostureCheck_Mfa) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{21, 1} + return file_edge_cmd_proto_rawDescGZIP(), []int{22, 1} } func (x *PostureCheck_Mfa) GetTimeoutSeconds() int64 { @@ -3761,7 +3865,7 @@ type PostureCheck_Os struct { func (x *PostureCheck_Os) Reset() { *x = PostureCheck_Os{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[56] + mi := &file_edge_cmd_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3774,7 +3878,7 @@ func (x *PostureCheck_Os) String() string { func (*PostureCheck_Os) ProtoMessage() {} func (x *PostureCheck_Os) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[56] + mi := &file_edge_cmd_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3787,7 +3891,7 @@ func (x *PostureCheck_Os) ProtoReflect() protoreflect.Message { // Deprecated: Use PostureCheck_Os.ProtoReflect.Descriptor instead. func (*PostureCheck_Os) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{21, 2} + return file_edge_cmd_proto_rawDescGZIP(), []int{22, 2} } func (x *PostureCheck_Os) GetOsType() string { @@ -3815,7 +3919,7 @@ type PostureCheck_OsList struct { func (x *PostureCheck_OsList) Reset() { *x = PostureCheck_OsList{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[57] + mi := &file_edge_cmd_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3828,7 +3932,7 @@ func (x *PostureCheck_OsList) String() string { func (*PostureCheck_OsList) ProtoMessage() {} func (x *PostureCheck_OsList) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[57] + mi := &file_edge_cmd_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3841,7 +3945,7 @@ func (x *PostureCheck_OsList) ProtoReflect() protoreflect.Message { // Deprecated: Use PostureCheck_OsList.ProtoReflect.Descriptor instead. func (*PostureCheck_OsList) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{21, 3} + return file_edge_cmd_proto_rawDescGZIP(), []int{22, 3} } func (x *PostureCheck_OsList) GetOsList() []*PostureCheck_Os { @@ -3865,7 +3969,7 @@ type PostureCheck_Process struct { func (x *PostureCheck_Process) Reset() { *x = PostureCheck_Process{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[58] + mi := &file_edge_cmd_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3878,7 +3982,7 @@ func (x *PostureCheck_Process) String() string { func (*PostureCheck_Process) ProtoMessage() {} func (x *PostureCheck_Process) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[58] + mi := &file_edge_cmd_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3891,7 +3995,7 @@ func (x *PostureCheck_Process) ProtoReflect() protoreflect.Message { // Deprecated: Use PostureCheck_Process.ProtoReflect.Descriptor instead. func (*PostureCheck_Process) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{21, 4} + return file_edge_cmd_proto_rawDescGZIP(), []int{22, 4} } func (x *PostureCheck_Process) GetOsType() string { @@ -3934,7 +4038,7 @@ type PostureCheck_ProcessMulti struct { func (x *PostureCheck_ProcessMulti) Reset() { *x = PostureCheck_ProcessMulti{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[59] + mi := &file_edge_cmd_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3947,7 +4051,7 @@ func (x *PostureCheck_ProcessMulti) String() string { func (*PostureCheck_ProcessMulti) ProtoMessage() {} func (x *PostureCheck_ProcessMulti) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[59] + mi := &file_edge_cmd_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3960,7 +4064,7 @@ func (x *PostureCheck_ProcessMulti) ProtoReflect() protoreflect.Message { // Deprecated: Use PostureCheck_ProcessMulti.ProtoReflect.Descriptor instead. func (*PostureCheck_ProcessMulti) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{21, 5} + return file_edge_cmd_proto_rawDescGZIP(), []int{22, 5} } func (x *PostureCheck_ProcessMulti) GetSemantic() string { @@ -3988,7 +4092,7 @@ type PostureCheck_Domains struct { func (x *PostureCheck_Domains) Reset() { *x = PostureCheck_Domains{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[60] + mi := &file_edge_cmd_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4001,7 +4105,7 @@ func (x *PostureCheck_Domains) String() string { func (*PostureCheck_Domains) ProtoMessage() {} func (x *PostureCheck_Domains) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[60] + mi := &file_edge_cmd_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4014,7 +4118,7 @@ func (x *PostureCheck_Domains) ProtoReflect() protoreflect.Message { // Deprecated: Use PostureCheck_Domains.ProtoReflect.Descriptor instead. func (*PostureCheck_Domains) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{21, 6} + return file_edge_cmd_proto_rawDescGZIP(), []int{22, 6} } func (x *PostureCheck_Domains) GetDomains() []string { @@ -4036,7 +4140,7 @@ type UpdateServiceConfigsCmd_ServiceConfig struct { func (x *UpdateServiceConfigsCmd_ServiceConfig) Reset() { *x = UpdateServiceConfigsCmd_ServiceConfig{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[67] + mi := &file_edge_cmd_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4049,7 +4153,7 @@ func (x *UpdateServiceConfigsCmd_ServiceConfig) String() string { func (*UpdateServiceConfigsCmd_ServiceConfig) ProtoMessage() {} func (x *UpdateServiceConfigsCmd_ServiceConfig) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[67] + mi := &file_edge_cmd_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4062,7 +4166,7 @@ func (x *UpdateServiceConfigsCmd_ServiceConfig) ProtoReflect() protoreflect.Mess // Deprecated: Use UpdateServiceConfigsCmd_ServiceConfig.ProtoReflect.Descriptor instead. func (*UpdateServiceConfigsCmd_ServiceConfig) Descriptor() ([]byte, []int) { - return file_edge_cmd_proto_rawDescGZIP(), []int{28, 0} + return file_edge_cmd_proto_rawDescGZIP(), []int{29, 0} } func (x *UpdateServiceConfigsCmd_ServiceConfig) GetServiceId() string { @@ -4341,574 +4445,598 @@ var file_edge_cmd_proto_rawDesc = []byte{ 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, 0x05, 0x0a, 0x0a, 0x45, - 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf3, 0x02, 0x0a, 0x0a, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, - 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x69, - 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x45, - 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x6f, 0x6c, - 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, - 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x12, 0x25, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, - 0x70, 0x72, 0x69, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x65, 0x72, 0x74, - 0x50, 0x65, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x63, 0x65, 0x72, - 0x74, 0x50, 0x65, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x08, 0x68, 0x6f, 0x73, - 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x73, 0x54, 0x75, - 0x6e, 0x6e, 0x65, 0x6c, 0x65, 0x72, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x73, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x65, 0x72, 0x45, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x70, 0x70, 0x44, 0x61, 0x74, - 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x70, 0x70, 0x44, 0x61, 0x74, 0x61, - 0x12, 0x39, 0x0a, 0x15, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x46, 0x69, - 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x03, 0x52, 0x15, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x46, 0x69, 0x6e, - 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x11, 0x75, - 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x11, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x65, 0x64, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x12, - 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, - 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x6f, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x61, - 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6e, 0x6f, 0x54, 0x72, 0x61, 0x76, 0x65, - 0x72, 0x73, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, - 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, - 0x70, 0x72, 0x69, 0x6e, 0x74, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x50, 0x65, - 0x6d, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x18, - 0x0a, 0x16, 0x5f, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x46, 0x69, 0x6e, - 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x75, 0x6e, 0x76, - 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x22, 0x6e, - 0x0a, 0x15, 0x52, 0x65, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x64, 0x67, 0x65, 0x52, 0x6f, - 0x75, 0x74, 0x65, 0x72, 0x43, 0x6d, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x65, 0x64, 0x67, 0x65, 0x52, - 0x6f, 0x75, 0x74, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, - 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x03, 0x63, - 0x74, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, - 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x03, 0x63, 0x74, 0x78, 0x22, 0xc4, - 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, - 0x74, 0x65, 0x72, 0x43, 0x6d, 0x64, 0x12, 0x3c, 0x0a, 0x0a, 0x65, 0x64, 0x67, 0x65, 0x52, 0x6f, - 0x75, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x7a, 0x69, 0x74, - 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x64, - 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x0a, 0x65, 0x64, 0x67, 0x65, 0x52, 0x6f, - 0x75, 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0a, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, - 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x6f, - 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x03, 0x63, 0x74, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1f, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, - 0x70, 0x62, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x52, 0x03, 0x63, 0x74, 0x78, 0x22, 0xb9, 0x02, 0x0a, 0x10, 0x45, 0x64, 0x67, 0x65, 0x52, 0x6f, - 0x75, 0x74, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x40, - 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x7a, - 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, - 0x45, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, - 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x12, 0x28, 0x0a, 0x0f, - 0x65, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, - 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x69, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x1a, 0x53, 0x0a, 0x09, - 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, - 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, - 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0xe0, 0x04, 0x0a, 0x0a, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, - 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, - 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x61, 0x67, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, - 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x12, 0x23, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x0f, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x69, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x01, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x52, 0x6f, 0x75, - 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0c, 0x65, 0x64, 0x67, 0x65, - 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, - 0x52, 0x0c, 0x65, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, - 0x01, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x36, 0x0a, 0x08, 0x69, 0x73, 0x73, 0x75, 0x65, - 0x64, 0x41, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x38, 0x0a, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, - 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6a, 0x77, 0x74, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6a, 0x77, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x63, - 0x61, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x04, 0x63, 0x61, 0x49, - 0x64, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x88, 0x01, 0x01, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, - 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x69, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x69, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x49, 0x64, 0x42, 0x0f, 0x0a, - 0x0d, 0x5f, 0x65, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x49, 0x64, 0x42, 0x07, - 0x0a, 0x05, 0x5f, 0x63, 0x61, 0x49, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xc5, 0x01, 0x0a, 0x25, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x41, 0x75, - 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x43, 0x6d, 0x64, 0x12, 0x22, - 0x0a, 0x0c, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x45, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, - 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x7a, 0x69, 0x74, 0x69, - 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x75, 0x74, - 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x0d, 0x61, 0x75, 0x74, 0x68, - 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x31, 0x0a, 0x03, 0x63, 0x74, 0x78, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, - 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x03, 0x63, 0x74, 0x78, 0x22, 0xb5, 0x06, 0x0a, - 0x11, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4a, 0x77, 0x74, 0x53, 0x69, 0x67, 0x6e, - 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, - 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x4a, 0x77, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x65, 0x72, - 0x74, 0x50, 0x65, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x63, 0x65, - 0x72, 0x74, 0x50, 0x65, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0c, 0x6a, 0x77, 0x6b, 0x73, - 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, - 0x52, 0x0c, 0x6a, 0x77, 0x6b, 0x73, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x88, 0x01, - 0x01, 0x12, 0x15, 0x0a, 0x03, 0x6b, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, - 0x52, 0x03, 0x6b, 0x69, 0x64, 0x88, 0x01, 0x01, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x12, 0x2d, 0x0a, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, - 0x74, 0x68, 0x55, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0f, 0x65, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x55, 0x72, 0x6c, 0x88, 0x01, - 0x01, 0x12, 0x24, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x49, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x0e, 0x63, 0x6c, 0x61, 0x69, 0x6d, - 0x73, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x04, 0x52, 0x0e, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x79, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x88, 0x01, - 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x61, 0x75, 0x64, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x08, 0x61, 0x75, 0x64, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x88, - 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, - 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x07, 0x52, 0x0b, 0x66, 0x69, 0x6e, 0x67, 0x65, - 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x08, 0x6e, 0x6f, 0x74, - 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x0f, 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, 0x08, 0x6e, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, - 0x72, 0x12, 0x38, 0x0a, 0x09, 0x6e, 0x6f, 0x74, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x09, 0x6e, 0x6f, 0x74, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x1a, 0x53, 0x0a, 0x09, 0x54, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x65, 0x72, 0x74, 0x50, + 0x65, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x65, 0x72, 0x74, 0x50, 0x65, + 0x6d, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, + 0x69, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x73, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, + 0x3e, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x74, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x3a, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x54, 0x61, 0x67, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x42, 0x0f, 0x0a, 0x0d, - 0x5f, 0x6a, 0x77, 0x6b, 0x73, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x06, 0x0a, - 0x04, 0x5f, 0x6b, 0x69, 0x64, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x55, 0x72, 0x6c, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x63, 0x6c, - 0x61, 0x69, 0x6d, 0x73, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x42, 0x09, 0x0a, 0x07, - 0x5f, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x75, 0x64, 0x69, - 0x65, 0x6e, 0x63, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, - 0x72, 0x69, 0x6e, 0x74, 0x22, 0xca, 0x0c, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, - 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, + 0x22, 0xd1, 0x05, 0x0a, 0x0a, 0x45, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, + 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, - 0x26, 0x0a, 0x0e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x49, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x54, 0x79, 0x70, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x73, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0e, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x12, - 0x18, 0x0a, 0x07, 0x69, 0x73, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x69, 0x73, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x6f, 0x6c, - 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, - 0x73, 0x12, 0x41, 0x0a, 0x07, 0x65, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, - 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x45, - 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x07, 0x65, 0x6e, 0x76, 0x49, 0x6e, 0x66, - 0x6f, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x07, 0x73, 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, - 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x2e, 0x53, 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x01, 0x52, 0x07, 0x73, 0x64, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, - 0x6e, 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, - 0x6f, 0x73, 0x74, 0x12, 0x77, 0x0a, 0x19, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, - 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, - 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x19, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x65, 0x0a, 0x13, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, - 0x73, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x7a, 0x69, 0x74, 0x69, - 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, - 0x73, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x70, 0x70, 0x44, 0x61, 0x74, 0x61, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x70, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x22, 0x0a, - 0x0c, 0x61, 0x75, 0x74, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x75, 0x74, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, - 0x64, 0x12, 0x23, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x41, 0x74, - 0x18, 0x12, 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, 0x48, 0x03, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x41, 0x74, - 0x88, 0x01, 0x01, 0x12, 0x45, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x55, - 0x6e, 0x74, 0x69, 0x6c, 0x18, 0x13, 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, 0x48, 0x04, 0x52, 0x0d, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x88, 0x01, 0x01, 0x1a, 0x9d, 0x01, 0x0a, 0x07, 0x45, - 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x73, - 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, - 0x73, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x73, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x73, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1a, - 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x1a, 0xa1, 0x01, 0x0a, 0x07, 0x53, - 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x70, 0x70, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x41, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, - 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, - 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x42, 0x72, - 0x61, 0x6e, 0x63, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x53, - 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, - 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, - 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x4c, 0x0a, 0x1e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x46, 0x0a, 0x18, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x65, 0x6e, - 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x73, 0x64, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, - 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x42, - 0x10, 0x0a, 0x0e, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x55, 0x6e, 0x74, 0x69, - 0x6c, 0x22, 0xcd, 0x01, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x57, 0x69, 0x74, 0x68, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x43, 0x6d, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, - 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x52, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x3e, - 0x0a, 0x0b, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, - 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x0b, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x31, - 0x0a, 0x03, 0x63, 0x74, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x7a, 0x69, - 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x03, 0x63, 0x74, - 0x78, 0x22, 0x9d, 0x02, 0x0a, 0x03, 0x4d, 0x66, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x33, 0x0a, 0x04, 0x74, 0x61, 0x67, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, - 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x4d, 0x66, 0x61, 0x2e, 0x54, - 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x1e, - 0x0a, 0x0a, 0x69, 0x73, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x1e, - 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, - 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x72, - 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x1a, 0x53, 0x0a, 0x09, - 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, - 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, - 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0xa0, 0x0a, 0x0a, 0x0c, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3c, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, - 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, - 0x74, 0x61, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x79, 0x70, 0x65, 0x49, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x79, 0x70, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x74, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, - 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x36, - 0x0a, 0x03, 0x6d, 0x61, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x7a, 0x69, - 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x50, - 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x4d, 0x61, 0x63, 0x48, - 0x00, 0x52, 0x03, 0x6d, 0x61, 0x63, 0x12, 0x36, 0x0a, 0x03, 0x6d, 0x66, 0x61, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, - 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x2e, 0x4d, 0x66, 0x61, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x66, 0x61, 0x12, 0x3f, - 0x0a, 0x06, 0x6f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, + 0x26, 0x0a, 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x67, 0x65, + 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, + 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1d, + 0x0a, 0x07, 0x63, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x01, 0x52, 0x07, 0x63, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, + 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x02, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2c, + 0x0a, 0x11, 0x69, 0x73, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x65, 0x72, 0x45, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x73, 0x54, 0x75, 0x6e, + 0x6e, 0x65, 0x6c, 0x65, 0x72, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, + 0x61, 0x70, 0x70, 0x44, 0x61, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, + 0x70, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x39, 0x0a, 0x15, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x15, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x88, 0x01, + 0x01, 0x12, 0x31, 0x0a, 0x11, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x43, + 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x11, + 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, + 0x6d, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x6f, 0x54, 0x72, + 0x61, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6e, + 0x6f, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, + 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, + 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x42, 0x0a, 0x0a, 0x08, 0x5f, + 0x63, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x68, 0x6f, 0x73, 0x74, + 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x42, 0x14, + 0x0a, 0x12, 0x5f, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x43, 0x65, 0x72, + 0x74, 0x50, 0x65, 0x6d, 0x22, 0x6e, 0x0a, 0x15, 0x52, 0x65, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, + 0x45, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x43, 0x6d, 0x64, 0x12, 0x22, 0x0a, + 0x0c, 0x65, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x31, 0x0a, 0x03, 0x63, 0x74, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, - 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x4f, - 0x73, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, - 0x42, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, - 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x12, 0x51, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, - 0x6c, 0x74, 0x69, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x7a, 0x69, 0x74, 0x69, - 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, - 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, - 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x48, 0x00, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, - 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x12, 0x42, 0x0a, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, - 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, - 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, - 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x48, - 0x00, 0x52, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x1a, 0x29, 0x0a, 0x03, 0x4d, 0x61, - 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x63, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, 0xaf, 0x01, 0x0a, 0x03, 0x4d, 0x66, 0x61, 0x12, 0x26, 0x0a, - 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4f, - 0x6e, 0x57, 0x61, 0x6b, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x50, 0x72, 0x6f, - 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x57, 0x61, 0x6b, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x72, 0x6f, - 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, - 0x6b, 0x12, 0x34, 0x0a, 0x15, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4c, 0x65, 0x67, 0x61, 0x63, - 0x79, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x15, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x45, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x1a, 0x3c, 0x0a, 0x02, 0x4f, 0x73, 0x12, 0x16, 0x0a, - 0x06, 0x4f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, - 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x4f, 0x73, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x43, 0x0a, 0x06, 0x4f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, - 0x39, 0x0a, 0x06, 0x6f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, - 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, - 0x4f, 0x73, 0x52, 0x06, 0x6f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x1a, 0x71, 0x0a, 0x07, 0x50, 0x72, - 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, - 0x68, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x6e, - 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0c, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x1a, 0x70, 0x0a, - 0x0c, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x12, 0x1a, 0x0a, - 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x12, 0x44, 0x0a, 0x09, 0x70, 0x72, 0x6f, - 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, - 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, - 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x50, 0x72, 0x6f, - 0x63, 0x65, 0x73, 0x73, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, - 0x23, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x64, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x73, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, - 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x73, 0x75, 0x62, - 0x74, 0x79, 0x70, 0x65, 0x22, 0xe7, 0x01, 0x0a, 0x0a, 0x52, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, 0x3a, 0x0a, - 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x69, - 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, - 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xff, - 0x02, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x37, - 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x7a, - 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x74, 0x65, 0x72, 0x6d, 0x69, - 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x12, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x53, - 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x41, - 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, - 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x65, 0x6e, 0x63, - 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x78, - 0x49, 0x64, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, - 0x6d, 0x61, 0x78, 0x49, 0x64, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x1a, 0x53, 0x0a, 0x09, 0x54, + 0x62, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, + 0x03, 0x63, 0x74, 0x78, 0x22, 0xc4, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, + 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x43, 0x6d, 0x64, 0x12, 0x3c, 0x0a, 0x0a, + 0x65, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, + 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x0a, + 0x65, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0a, 0x65, 0x6e, + 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, + 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x65, 0x6e, + 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x03, 0x63, 0x74, 0x78, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, + 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x03, 0x63, 0x74, 0x78, 0x22, 0xb9, 0x02, 0x0a, 0x10, + 0x45, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, + 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, + 0x69, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, + 0x69, 0x63, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x64, 0x67, + 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, + 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe0, 0x04, 0x0a, 0x0a, 0x45, 0x6e, 0x72, 0x6f, + 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, + 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, + 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x23, 0x0a, 0x0a, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x2d, 0x0a, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, + 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, + 0x0a, 0x0c, 0x65, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x49, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0c, 0x65, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, + 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x36, 0x0a, + 0x08, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x41, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x69, 0x73, 0x73, + 0x75, 0x65, 0x64, 0x41, 0x74, 0x12, 0x38, 0x0a, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, + 0x41, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, + 0x10, 0x0a, 0x03, 0x6a, 0x77, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6a, 0x77, + 0x74, 0x12, 0x17, 0x0a, 0x04, 0x63, 0x61, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x03, 0x52, 0x04, 0x63, 0x61, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0xc5, 0x02, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x64, 0x67, 0x65, - 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x47, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, - 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, - 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, - 0x74, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6d, - 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x6d, - 0x61, 0x6e, 0x74, 0x69, 0x63, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, - 0x74, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, - 0x65, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, - 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, - 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfb, 0x02, 0x0a, 0x0d, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3d, - 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, + 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x42, + 0x12, 0x0a, 0x10, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x72, 0x49, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x65, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, + 0x65, 0x72, 0x49, 0x64, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x63, 0x61, 0x49, 0x64, 0x42, 0x0b, 0x0a, + 0x09, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xc5, 0x01, 0x0a, 0x25, 0x52, + 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, + 0x57, 0x69, 0x74, 0x68, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x6f, + 0x72, 0x43, 0x6d, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6e, 0x72, 0x6f, + 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, + 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1f, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, + 0x70, 0x62, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, + 0x52, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x12, + 0x31, 0x0a, 0x03, 0x63, 0x74, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x54, 0x61, - 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x1a, 0x0a, - 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0d, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, - 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, - 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x6f, 0x6c, 0x65, - 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x79, 0x70, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x79, 0x70, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x03, 0x63, + 0x74, 0x78, 0x22, 0xb5, 0x06, 0x0a, 0x11, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4a, + 0x77, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x04, + 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x7a, 0x69, 0x74, + 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4a, 0x77, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x2e, + 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, + 0x1d, 0x0a, 0x07, 0x63, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x07, 0x63, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x27, + 0x0a, 0x0c, 0x6a, 0x77, 0x6b, 0x73, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0c, 0x6a, 0x77, 0x6b, 0x73, 0x45, 0x6e, 0x64, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, 0x6b, 0x69, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x03, 0x6b, 0x69, 0x64, 0x88, 0x01, 0x01, 0x12, 0x18, + 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2d, 0x0a, 0x0f, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x55, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x03, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, + 0x68, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, + 0x75, 0x73, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x2b, 0x0a, + 0x0e, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x0e, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x69, 0x73, + 0x73, 0x75, 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x06, 0x69, 0x73, + 0x73, 0x75, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x61, 0x75, 0x64, 0x69, 0x65, + 0x6e, 0x63, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x08, 0x61, 0x75, 0x64, + 0x69, 0x65, 0x6e, 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x67, + 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x07, 0x52, + 0x0b, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, + 0x36, 0x0a, 0x08, 0x6e, 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x0f, 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, 0x08, 0x6e, + 0x6f, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x09, 0x6e, 0x6f, 0x74, 0x42, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x6e, 0x6f, 0x74, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8e, 0x04, 0x0a, 0x0d, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x04, - 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x69, 0x74, - 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x69, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x54, 0x61, 0x67, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, - 0x73, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0a, 0x69, 0x73, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0b, 0x66, - 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x0b, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x88, - 0x01, 0x01, 0x12, 0x39, 0x0a, 0x15, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, - 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x01, 0x52, 0x15, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x46, - 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, - 0x11, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x43, 0x65, 0x72, 0x74, 0x50, - 0x65, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x11, 0x75, 0x6e, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x88, 0x01, 0x01, - 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, - 0x63, 0x6f, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x6f, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, - 0x73, 0x61, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6e, 0x6f, 0x54, 0x72, 0x61, - 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x50, + 0x65, 0x6d, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6a, 0x77, 0x6b, 0x73, 0x45, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x6b, 0x69, 0x64, 0x42, 0x12, 0x0a, 0x10, 0x5f, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x55, 0x72, 0x6c, 0x42, + 0x11, 0x0a, 0x0f, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x42, 0x0b, 0x0a, + 0x09, 0x5f, 0x61, 0x75, 0x64, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x66, + 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x22, 0xca, 0x0c, 0x0a, 0x08, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x04, 0x74, + 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x7a, 0x69, 0x74, 0x69, + 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x54, 0x79, 0x70, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, + 0x0e, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x73, 0x41, 0x64, 0x6d, 0x69, 0x6e, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x12, + 0x26, 0x0a, 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x41, 0x0a, 0x07, 0x65, 0x6e, 0x76, 0x49, 0x6e, + 0x66, 0x6f, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, + 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x07, + 0x65, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x07, 0x73, 0x64, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x7a, 0x69, + 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x53, 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x48, + 0x01, 0x52, 0x07, 0x73, 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, + 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, + 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, + 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x77, 0x0a, 0x19, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, + 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x7a, + 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x19, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, + 0x65, 0x73, 0x12, 0x65, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x33, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, + 0x70, 0x62, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x70, 0x70, + 0x44, 0x61, 0x74, 0x61, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x70, 0x70, 0x44, + 0x61, 0x74, 0x61, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x75, 0x74, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x49, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x75, 0x74, 0x68, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0a, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x18, 0x12, 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, 0x48, 0x03, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x12, 0x45, 0x0a, 0x0d, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x18, 0x13, 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, 0x48, 0x04, 0x52, 0x0d, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x88, 0x01, 0x01, + 0x1a, 0x9d, 0x01, 0x0a, 0x07, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x41, 0x72, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, + 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x73, + 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x73, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x73, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, + 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, + 0x1a, 0xa1, 0x01, 0x0a, 0x07, 0x53, 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, + 0x41, 0x70, 0x70, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x41, 0x70, 0x70, + 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, + 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4c, 0x0a, 0x1e, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, + 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x46, 0x0a, 0x18, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, + 0x0a, 0x0a, 0x08, 0x5f, 0x65, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x0a, 0x0a, 0x08, 0x5f, + 0x73, 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x41, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x22, 0xcd, 0x01, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x57, 0x69, 0x74, 0x68, 0x45, 0x6e, + 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6d, 0x64, 0x12, 0x36, 0x0a, 0x08, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, + 0x62, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x08, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x0b, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x7a, 0x69, 0x74, 0x69, + 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, + 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x03, 0x63, 0x74, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, + 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x52, 0x03, 0x63, 0x74, 0x78, 0x22, 0x9d, 0x02, 0x0a, 0x03, 0x4d, 0x66, 0x61, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x33, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, + 0x2e, 0x4d, 0x66, 0x61, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, + 0x74, 0x61, 0x67, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x24, 0x0a, 0x0d, + 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, + 0x65, 0x73, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x66, 0x69, 0x6e, 0x67, - 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x75, 0x6e, 0x76, 0x65, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa0, 0x0a, 0x0a, 0x0c, 0x50, 0x6f, 0x73, 0x74, + 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3c, 0x0a, 0x04, + 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x7a, 0x69, 0x74, + 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, + 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x79, + 0x70, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x79, 0x70, 0x65, + 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, + 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x03, 0x6d, 0x61, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, + 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x2e, 0x4d, 0x61, 0x63, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x63, 0x12, 0x36, 0x0a, 0x03, + 0x6d, 0x66, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x7a, 0x69, 0x74, 0x69, + 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, + 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x4d, 0x66, 0x61, 0x48, 0x00, 0x52, + 0x03, 0x6d, 0x66, 0x61, 0x12, 0x3f, 0x0a, 0x06, 0x6f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, + 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x4f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x06, 0x6f, + 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, + 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, + 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x48, 0x00, + 0x52, 0x07, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x51, 0x0a, 0x0c, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2b, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, + 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, + 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x48, 0x00, 0x52, 0x0c, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x12, 0x42, 0x0a, 0x07, + 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, + 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x44, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, + 0x1a, 0x29, 0x0a, 0x03, 0x4d, 0x61, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x63, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x6d, + 0x61, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, 0xaf, 0x01, 0x0a, 0x03, + 0x4d, 0x66, 0x61, 0x12, 0x26, 0x0a, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x54, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x50, + 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x57, 0x61, 0x6b, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0c, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x57, 0x61, 0x6b, 0x65, 0x12, + 0x26, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, + 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4f, + 0x6e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x34, 0x0a, 0x15, 0x49, 0x67, 0x6e, 0x6f, 0x72, + 0x65, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4c, 0x65, + 0x67, 0x61, 0x63, 0x79, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x1a, 0x3c, 0x0a, + 0x02, 0x4f, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x4f, + 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0a, 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x43, 0x0a, 0x06, 0x4f, + 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, + 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x4f, 0x73, 0x52, 0x06, 0x6f, 0x73, 0x4c, 0x69, 0x73, 0x74, + 0x1a, 0x71, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x4f, + 0x73, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x73, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, + 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, + 0x6e, 0x74, 0x73, 0x1a, 0x70, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, + 0x6c, 0x74, 0x69, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x12, + 0x44, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, + 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, 0x23, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, + 0x12, 0x18, 0x0a, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, + 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, + 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, + 0x09, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x22, 0xe7, 0x01, 0x0a, 0x0a, 0x52, + 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x65, 0x78, 0x70, + 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, + 0x73, 0x41, 0x74, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, + 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, + 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, + 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xff, 0x02, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, + 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x61, + 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x2e, 0x0a, + 0x12, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x74, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x26, 0x0a, + 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, + 0x2e, 0x0a, 0x12, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x6e, 0x63, + 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, + 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x49, 0x64, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x49, 0x64, 0x6c, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, + 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc5, 0x02, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x45, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, + 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, + 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, + 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, + 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x12, 0x28, 0x0a, 0x0f, 0x65, + 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, + 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfb, + 0x02, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, + 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, + 0x61, 0x67, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x12, + 0x24, 0x0a, 0x0d, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x6f, 0x6c, 0x65, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x70, 0x6f, 0x73, + 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x54, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, + 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8e, 0x04, 0x0a, + 0x0d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x29, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, + 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x72, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, + 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, + 0x64, 0x12, 0x25, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, + 0x70, 0x72, 0x69, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x15, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, - 0x74, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, - 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x22, 0xc2, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x43, - 0x6d, 0x64, 0x12, 0x37, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, - 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x52, 0x6f, 0x75, - 0x74, 0x65, 0x72, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0a, 0x65, - 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, - 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x65, - 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x03, 0x63, 0x74, 0x78, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, - 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x03, 0x63, 0x74, 0x78, 0x22, 0xaa, 0x02, 0x0a, - 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x73, 0x43, 0x6d, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x64, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x64, 0x64, 0x12, 0x5f, 0x0a, 0x0e, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, - 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x43, 0x6d, 0x64, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0e, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x31, 0x0a, 0x03, 0x63, - 0x74, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, - 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x03, 0x63, 0x74, 0x78, 0x1a, 0x49, - 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, - 0x08, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x2a, 0x80, 0x02, 0x0a, 0x0b, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x65, 0x72, - 0x6f, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x64, 0x67, - 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x10, - 0xe8, 0x07, 0x12, 0x2b, 0x0a, 0x26, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x45, 0x6e, 0x72, - 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x41, 0x75, 0x74, 0x68, 0x65, - 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x10, 0xe9, 0x07, 0x12, - 0x19, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, - 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x10, 0xea, 0x07, 0x12, 0x1c, 0x0a, 0x17, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, - 0x72, 0x54, 0x79, 0x70, 0x65, 0x10, 0xeb, 0x07, 0x12, 0x26, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x57, 0x69, 0x74, 0x68, 0x45, 0x6e, - 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x54, 0x79, 0x70, 0x65, 0x10, 0xec, 0x07, - 0x12, 0x1d, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x54, 0x79, 0x70, 0x65, 0x10, 0xed, 0x07, 0x12, - 0x1b, 0x0a, 0x16, 0x52, 0x65, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x64, 0x67, 0x65, 0x52, - 0x6f, 0x75, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x10, 0xee, 0x07, 0x42, 0x29, 0x5a, 0x27, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x7a, - 0x69, 0x74, 0x69, 0x2f, 0x65, 0x64, 0x67, 0x65, 0x2f, 0x70, 0x62, 0x2f, 0x65, 0x64, 0x67, 0x65, - 0x5f, 0x63, 0x6d, 0x64, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x15, 0x75, 0x6e, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x65, 0x64, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, + 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x11, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, + 0x64, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, + 0x52, 0x11, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x43, 0x65, 0x72, 0x74, + 0x50, 0x65, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x6f, + 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x6e, 0x6f, 0x54, 0x72, 0x61, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x1a, 0x53, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, + 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x67, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0e, 0x0a, + 0x0c, 0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x42, 0x18, 0x0a, + 0x16, 0x5f, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x46, 0x69, 0x6e, 0x67, + 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x75, 0x6e, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x22, 0xc2, 0x01, + 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x52, + 0x6f, 0x75, 0x74, 0x65, 0x72, 0x43, 0x6d, 0x64, 0x12, 0x37, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, + 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, + 0x72, 0x12, 0x3c, 0x0a, 0x0a, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, + 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x31, 0x0a, 0x03, 0x63, 0x74, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x7a, + 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x03, 0x63, + 0x74, 0x78, 0x22, 0xaa, 0x02, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x43, 0x6d, 0x64, 0x12, 0x1e, + 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x10, + 0x0a, 0x03, 0x61, 0x64, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x64, 0x64, + 0x12, 0x5f, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, + 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, + 0x43, 0x6d, 0x64, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x73, 0x12, 0x31, 0x0a, 0x03, 0x63, 0x74, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x2e, 0x70, + 0x62, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, + 0x03, 0x63, 0x74, 0x78, 0x1a, 0x49, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x2a, + 0x80, 0x02, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x08, 0x0a, 0x04, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x18, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x45, 0x64, 0x67, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, + 0x72, 0x54, 0x79, 0x70, 0x65, 0x10, 0xe8, 0x07, 0x12, 0x2b, 0x0a, 0x26, 0x52, 0x65, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x57, 0x69, 0x74, + 0x68, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x79, + 0x70, 0x65, 0x10, 0xe9, 0x07, 0x12, 0x19, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, + 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x10, 0xea, 0x07, + 0x12, 0x1c, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x10, 0xeb, 0x07, 0x12, 0x26, + 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x57, 0x69, 0x74, 0x68, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x54, + 0x79, 0x70, 0x65, 0x10, 0xec, 0x07, 0x12, 0x1d, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x54, 0x79, + 0x70, 0x65, 0x10, 0xed, 0x07, 0x12, 0x1b, 0x0a, 0x16, 0x52, 0x65, 0x45, 0x6e, 0x72, 0x6f, 0x6c, + 0x6c, 0x45, 0x64, 0x67, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x10, + 0xee, 0x07, 0x42, 0x29, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x7a, 0x69, 0x74, 0x69, 0x2f, 0x65, 0x64, 0x67, 0x65, 0x2f, 0x70, + 0x62, 0x2f, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6d, 0x64, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4924,7 +5052,7 @@ func file_edge_cmd_proto_rawDescGZIP() []byte { } var file_edge_cmd_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_edge_cmd_proto_msgTypes = make([]protoimpl.MessageInfo, 68) +var file_edge_cmd_proto_msgTypes = make([]protoimpl.MessageInfo, 70) var file_edge_cmd_proto_goTypes = []interface{}{ (CommandType)(0), // 0: ziti.edge_cmd.pb.CommandType (*ChangeContext)(nil), // 1: ziti.edge_cmd.pb.ChangeContext @@ -4938,153 +5066,158 @@ var file_edge_cmd_proto_goTypes = []interface{}{ (*Ca)(nil), // 9: ziti.edge_cmd.pb.Ca (*Config)(nil), // 10: ziti.edge_cmd.pb.Config (*ConfigType)(nil), // 11: ziti.edge_cmd.pb.ConfigType - (*EdgeRouter)(nil), // 12: ziti.edge_cmd.pb.EdgeRouter - (*ReEnrollEdgeRouterCmd)(nil), // 13: ziti.edge_cmd.pb.ReEnrollEdgeRouterCmd - (*CreateEdgeRouterCmd)(nil), // 14: ziti.edge_cmd.pb.CreateEdgeRouterCmd - (*EdgeRouterPolicy)(nil), // 15: ziti.edge_cmd.pb.EdgeRouterPolicy - (*Enrollment)(nil), // 16: ziti.edge_cmd.pb.Enrollment - (*ReplaceEnrollmentWithAuthenticatorCmd)(nil), // 17: ziti.edge_cmd.pb.ReplaceEnrollmentWithAuthenticatorCmd - (*ExternalJwtSigner)(nil), // 18: ziti.edge_cmd.pb.ExternalJwtSigner - (*Identity)(nil), // 19: ziti.edge_cmd.pb.Identity - (*CreateIdentityWithEnrollmentsCmd)(nil), // 20: ziti.edge_cmd.pb.CreateIdentityWithEnrollmentsCmd - (*Mfa)(nil), // 21: ziti.edge_cmd.pb.Mfa - (*PostureCheck)(nil), // 22: ziti.edge_cmd.pb.PostureCheck - (*Revocation)(nil), // 23: ziti.edge_cmd.pb.Revocation - (*Service)(nil), // 24: ziti.edge_cmd.pb.Service - (*ServiceEdgeRouterPolicy)(nil), // 25: ziti.edge_cmd.pb.ServiceEdgeRouterPolicy - (*ServicePolicy)(nil), // 26: ziti.edge_cmd.pb.ServicePolicy - (*TransitRouter)(nil), // 27: ziti.edge_cmd.pb.TransitRouter - (*CreateTransitRouterCmd)(nil), // 28: ziti.edge_cmd.pb.CreateTransitRouterCmd - (*UpdateServiceConfigsCmd)(nil), // 29: ziti.edge_cmd.pb.UpdateServiceConfigsCmd - nil, // 30: ziti.edge_cmd.pb.ChangeContext.AttributesEntry - nil, // 31: ziti.edge_cmd.pb.JsonMap.ValueEntry - (*Authenticator_Cert)(nil), // 32: ziti.edge_cmd.pb.Authenticator.Cert - (*Authenticator_Updb)(nil), // 33: ziti.edge_cmd.pb.Authenticator.Updb - nil, // 34: ziti.edge_cmd.pb.Authenticator.TagsEntry - (*AuthPolicy_Primary)(nil), // 35: ziti.edge_cmd.pb.AuthPolicy.Primary - (*AuthPolicy_Secondary)(nil), // 36: ziti.edge_cmd.pb.AuthPolicy.Secondary - nil, // 37: ziti.edge_cmd.pb.AuthPolicy.TagsEntry - (*AuthPolicy_Primary_Cert)(nil), // 38: ziti.edge_cmd.pb.AuthPolicy.Primary.Cert - (*AuthPolicy_Primary_Updb)(nil), // 39: ziti.edge_cmd.pb.AuthPolicy.Primary.Updb - (*AuthPolicy_Primary_ExtJwt)(nil), // 40: ziti.edge_cmd.pb.AuthPolicy.Primary.ExtJwt - (*Ca_ExternalIdClaim)(nil), // 41: ziti.edge_cmd.pb.Ca.ExternalIdClaim - nil, // 42: ziti.edge_cmd.pb.Ca.TagsEntry - nil, // 43: ziti.edge_cmd.pb.Config.TagsEntry - nil, // 44: ziti.edge_cmd.pb.ConfigType.TagsEntry - nil, // 45: ziti.edge_cmd.pb.EdgeRouter.TagsEntry - nil, // 46: ziti.edge_cmd.pb.EdgeRouterPolicy.TagsEntry - nil, // 47: ziti.edge_cmd.pb.Enrollment.TagsEntry - nil, // 48: ziti.edge_cmd.pb.ExternalJwtSigner.TagsEntry - (*Identity_EnvInfo)(nil), // 49: ziti.edge_cmd.pb.Identity.EnvInfo - (*Identity_SdkInfo)(nil), // 50: ziti.edge_cmd.pb.Identity.SdkInfo - nil, // 51: ziti.edge_cmd.pb.Identity.TagsEntry - nil, // 52: ziti.edge_cmd.pb.Identity.ServiceHostingPrecedencesEntry - nil, // 53: ziti.edge_cmd.pb.Identity.ServiceHostingCostsEntry - nil, // 54: ziti.edge_cmd.pb.Mfa.TagsEntry - (*PostureCheck_Mac)(nil), // 55: ziti.edge_cmd.pb.PostureCheck.Mac - (*PostureCheck_Mfa)(nil), // 56: ziti.edge_cmd.pb.PostureCheck.Mfa - (*PostureCheck_Os)(nil), // 57: ziti.edge_cmd.pb.PostureCheck.Os - (*PostureCheck_OsList)(nil), // 58: ziti.edge_cmd.pb.PostureCheck.OsList - (*PostureCheck_Process)(nil), // 59: ziti.edge_cmd.pb.PostureCheck.Process - (*PostureCheck_ProcessMulti)(nil), // 60: ziti.edge_cmd.pb.PostureCheck.ProcessMulti - (*PostureCheck_Domains)(nil), // 61: ziti.edge_cmd.pb.PostureCheck.Domains - nil, // 62: ziti.edge_cmd.pb.PostureCheck.TagsEntry - nil, // 63: ziti.edge_cmd.pb.Revocation.TagsEntry - nil, // 64: ziti.edge_cmd.pb.Service.TagsEntry - nil, // 65: ziti.edge_cmd.pb.ServiceEdgeRouterPolicy.TagsEntry - nil, // 66: ziti.edge_cmd.pb.ServicePolicy.TagsEntry - nil, // 67: ziti.edge_cmd.pb.TransitRouter.TagsEntry - (*UpdateServiceConfigsCmd_ServiceConfig)(nil), // 68: ziti.edge_cmd.pb.UpdateServiceConfigsCmd.ServiceConfig - (*timestamppb.Timestamp)(nil), // 69: google.protobuf.Timestamp + (*Controller)(nil), // 12: ziti.edge_cmd.pb.Controller + (*EdgeRouter)(nil), // 13: ziti.edge_cmd.pb.EdgeRouter + (*ReEnrollEdgeRouterCmd)(nil), // 14: ziti.edge_cmd.pb.ReEnrollEdgeRouterCmd + (*CreateEdgeRouterCmd)(nil), // 15: ziti.edge_cmd.pb.CreateEdgeRouterCmd + (*EdgeRouterPolicy)(nil), // 16: ziti.edge_cmd.pb.EdgeRouterPolicy + (*Enrollment)(nil), // 17: ziti.edge_cmd.pb.Enrollment + (*ReplaceEnrollmentWithAuthenticatorCmd)(nil), // 18: ziti.edge_cmd.pb.ReplaceEnrollmentWithAuthenticatorCmd + (*ExternalJwtSigner)(nil), // 19: ziti.edge_cmd.pb.ExternalJwtSigner + (*Identity)(nil), // 20: ziti.edge_cmd.pb.Identity + (*CreateIdentityWithEnrollmentsCmd)(nil), // 21: ziti.edge_cmd.pb.CreateIdentityWithEnrollmentsCmd + (*Mfa)(nil), // 22: ziti.edge_cmd.pb.Mfa + (*PostureCheck)(nil), // 23: ziti.edge_cmd.pb.PostureCheck + (*Revocation)(nil), // 24: ziti.edge_cmd.pb.Revocation + (*Service)(nil), // 25: ziti.edge_cmd.pb.Service + (*ServiceEdgeRouterPolicy)(nil), // 26: ziti.edge_cmd.pb.ServiceEdgeRouterPolicy + (*ServicePolicy)(nil), // 27: ziti.edge_cmd.pb.ServicePolicy + (*TransitRouter)(nil), // 28: ziti.edge_cmd.pb.TransitRouter + (*CreateTransitRouterCmd)(nil), // 29: ziti.edge_cmd.pb.CreateTransitRouterCmd + (*UpdateServiceConfigsCmd)(nil), // 30: ziti.edge_cmd.pb.UpdateServiceConfigsCmd + nil, // 31: ziti.edge_cmd.pb.ChangeContext.AttributesEntry + nil, // 32: ziti.edge_cmd.pb.JsonMap.ValueEntry + (*Authenticator_Cert)(nil), // 33: ziti.edge_cmd.pb.Authenticator.Cert + (*Authenticator_Updb)(nil), // 34: ziti.edge_cmd.pb.Authenticator.Updb + nil, // 35: ziti.edge_cmd.pb.Authenticator.TagsEntry + (*AuthPolicy_Primary)(nil), // 36: ziti.edge_cmd.pb.AuthPolicy.Primary + (*AuthPolicy_Secondary)(nil), // 37: ziti.edge_cmd.pb.AuthPolicy.Secondary + nil, // 38: ziti.edge_cmd.pb.AuthPolicy.TagsEntry + (*AuthPolicy_Primary_Cert)(nil), // 39: ziti.edge_cmd.pb.AuthPolicy.Primary.Cert + (*AuthPolicy_Primary_Updb)(nil), // 40: ziti.edge_cmd.pb.AuthPolicy.Primary.Updb + (*AuthPolicy_Primary_ExtJwt)(nil), // 41: ziti.edge_cmd.pb.AuthPolicy.Primary.ExtJwt + (*Ca_ExternalIdClaim)(nil), // 42: ziti.edge_cmd.pb.Ca.ExternalIdClaim + nil, // 43: ziti.edge_cmd.pb.Ca.TagsEntry + nil, // 44: ziti.edge_cmd.pb.Config.TagsEntry + nil, // 45: ziti.edge_cmd.pb.ConfigType.TagsEntry + nil, // 46: ziti.edge_cmd.pb.Controller.TagsEntry + nil, // 47: ziti.edge_cmd.pb.EdgeRouter.TagsEntry + nil, // 48: ziti.edge_cmd.pb.EdgeRouterPolicy.TagsEntry + nil, // 49: ziti.edge_cmd.pb.Enrollment.TagsEntry + nil, // 50: ziti.edge_cmd.pb.ExternalJwtSigner.TagsEntry + (*Identity_EnvInfo)(nil), // 51: ziti.edge_cmd.pb.Identity.EnvInfo + (*Identity_SdkInfo)(nil), // 52: ziti.edge_cmd.pb.Identity.SdkInfo + nil, // 53: ziti.edge_cmd.pb.Identity.TagsEntry + nil, // 54: ziti.edge_cmd.pb.Identity.ServiceHostingPrecedencesEntry + nil, // 55: ziti.edge_cmd.pb.Identity.ServiceHostingCostsEntry + nil, // 56: ziti.edge_cmd.pb.Mfa.TagsEntry + (*PostureCheck_Mac)(nil), // 57: ziti.edge_cmd.pb.PostureCheck.Mac + (*PostureCheck_Mfa)(nil), // 58: ziti.edge_cmd.pb.PostureCheck.Mfa + (*PostureCheck_Os)(nil), // 59: ziti.edge_cmd.pb.PostureCheck.Os + (*PostureCheck_OsList)(nil), // 60: ziti.edge_cmd.pb.PostureCheck.OsList + (*PostureCheck_Process)(nil), // 61: ziti.edge_cmd.pb.PostureCheck.Process + (*PostureCheck_ProcessMulti)(nil), // 62: ziti.edge_cmd.pb.PostureCheck.ProcessMulti + (*PostureCheck_Domains)(nil), // 63: ziti.edge_cmd.pb.PostureCheck.Domains + nil, // 64: ziti.edge_cmd.pb.PostureCheck.TagsEntry + nil, // 65: ziti.edge_cmd.pb.Revocation.TagsEntry + nil, // 66: ziti.edge_cmd.pb.Service.TagsEntry + nil, // 67: ziti.edge_cmd.pb.ServiceEdgeRouterPolicy.TagsEntry + nil, // 68: ziti.edge_cmd.pb.ServicePolicy.TagsEntry + nil, // 69: ziti.edge_cmd.pb.TransitRouter.TagsEntry + (*UpdateServiceConfigsCmd_ServiceConfig)(nil), // 70: ziti.edge_cmd.pb.UpdateServiceConfigsCmd.ServiceConfig + (*timestamppb.Timestamp)(nil), // 71: google.protobuf.Timestamp } var file_edge_cmd_proto_depIdxs = []int32{ - 30, // 0: ziti.edge_cmd.pb.ChangeContext.attributes:type_name -> ziti.edge_cmd.pb.ChangeContext.AttributesEntry + 31, // 0: ziti.edge_cmd.pb.ChangeContext.attributes:type_name -> ziti.edge_cmd.pb.ChangeContext.AttributesEntry 1, // 1: ziti.edge_cmd.pb.CreateEdgeTerminatorCommand.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext - 31, // 2: ziti.edge_cmd.pb.JsonMap.value:type_name -> ziti.edge_cmd.pb.JsonMap.ValueEntry + 32, // 2: ziti.edge_cmd.pb.JsonMap.value:type_name -> ziti.edge_cmd.pb.JsonMap.ValueEntry 6, // 3: ziti.edge_cmd.pb.JsonList.value:type_name -> ziti.edge_cmd.pb.JsonValue 4, // 4: ziti.edge_cmd.pb.JsonValue.mapValue:type_name -> ziti.edge_cmd.pb.JsonMap 5, // 5: ziti.edge_cmd.pb.JsonValue.listValue:type_name -> ziti.edge_cmd.pb.JsonList - 34, // 6: ziti.edge_cmd.pb.Authenticator.tags:type_name -> ziti.edge_cmd.pb.Authenticator.TagsEntry - 32, // 7: ziti.edge_cmd.pb.Authenticator.cert:type_name -> ziti.edge_cmd.pb.Authenticator.Cert - 33, // 8: ziti.edge_cmd.pb.Authenticator.updb:type_name -> ziti.edge_cmd.pb.Authenticator.Updb - 35, // 9: ziti.edge_cmd.pb.AuthPolicy.primary:type_name -> ziti.edge_cmd.pb.AuthPolicy.Primary - 36, // 10: ziti.edge_cmd.pb.AuthPolicy.secondary:type_name -> ziti.edge_cmd.pb.AuthPolicy.Secondary - 37, // 11: ziti.edge_cmd.pb.AuthPolicy.tags:type_name -> ziti.edge_cmd.pb.AuthPolicy.TagsEntry - 42, // 12: ziti.edge_cmd.pb.Ca.tags:type_name -> ziti.edge_cmd.pb.Ca.TagsEntry - 41, // 13: ziti.edge_cmd.pb.Ca.externalIdClaim:type_name -> ziti.edge_cmd.pb.Ca.ExternalIdClaim - 43, // 14: ziti.edge_cmd.pb.Config.tags:type_name -> ziti.edge_cmd.pb.Config.TagsEntry - 44, // 15: ziti.edge_cmd.pb.ConfigType.tags:type_name -> ziti.edge_cmd.pb.ConfigType.TagsEntry - 45, // 16: ziti.edge_cmd.pb.EdgeRouter.tags:type_name -> ziti.edge_cmd.pb.EdgeRouter.TagsEntry - 1, // 17: ziti.edge_cmd.pb.ReEnrollEdgeRouterCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext - 12, // 18: ziti.edge_cmd.pb.CreateEdgeRouterCmd.edgeRouter:type_name -> ziti.edge_cmd.pb.EdgeRouter - 16, // 19: ziti.edge_cmd.pb.CreateEdgeRouterCmd.enrollment:type_name -> ziti.edge_cmd.pb.Enrollment - 1, // 20: ziti.edge_cmd.pb.CreateEdgeRouterCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext - 46, // 21: ziti.edge_cmd.pb.EdgeRouterPolicy.tags:type_name -> ziti.edge_cmd.pb.EdgeRouterPolicy.TagsEntry - 47, // 22: ziti.edge_cmd.pb.Enrollment.tags:type_name -> ziti.edge_cmd.pb.Enrollment.TagsEntry - 69, // 23: ziti.edge_cmd.pb.Enrollment.issuedAt:type_name -> google.protobuf.Timestamp - 69, // 24: ziti.edge_cmd.pb.Enrollment.expiresAt:type_name -> google.protobuf.Timestamp - 7, // 25: ziti.edge_cmd.pb.ReplaceEnrollmentWithAuthenticatorCmd.authenticator:type_name -> ziti.edge_cmd.pb.Authenticator - 1, // 26: ziti.edge_cmd.pb.ReplaceEnrollmentWithAuthenticatorCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext - 48, // 27: ziti.edge_cmd.pb.ExternalJwtSigner.tags:type_name -> ziti.edge_cmd.pb.ExternalJwtSigner.TagsEntry - 69, // 28: ziti.edge_cmd.pb.ExternalJwtSigner.notAfter:type_name -> google.protobuf.Timestamp - 69, // 29: ziti.edge_cmd.pb.ExternalJwtSigner.notBefore:type_name -> google.protobuf.Timestamp - 51, // 30: ziti.edge_cmd.pb.Identity.tags:type_name -> ziti.edge_cmd.pb.Identity.TagsEntry - 49, // 31: ziti.edge_cmd.pb.Identity.envInfo:type_name -> ziti.edge_cmd.pb.Identity.EnvInfo - 50, // 32: ziti.edge_cmd.pb.Identity.sdkInfo:type_name -> ziti.edge_cmd.pb.Identity.SdkInfo - 52, // 33: ziti.edge_cmd.pb.Identity.serviceHostingPrecedences:type_name -> ziti.edge_cmd.pb.Identity.ServiceHostingPrecedencesEntry - 53, // 34: ziti.edge_cmd.pb.Identity.serviceHostingCosts:type_name -> ziti.edge_cmd.pb.Identity.ServiceHostingCostsEntry - 69, // 35: ziti.edge_cmd.pb.Identity.disabledAt:type_name -> google.protobuf.Timestamp - 69, // 36: ziti.edge_cmd.pb.Identity.disabledUntil:type_name -> google.protobuf.Timestamp - 19, // 37: ziti.edge_cmd.pb.CreateIdentityWithEnrollmentsCmd.identity:type_name -> ziti.edge_cmd.pb.Identity - 16, // 38: ziti.edge_cmd.pb.CreateIdentityWithEnrollmentsCmd.enrollments:type_name -> ziti.edge_cmd.pb.Enrollment - 1, // 39: ziti.edge_cmd.pb.CreateIdentityWithEnrollmentsCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext - 54, // 40: ziti.edge_cmd.pb.Mfa.tags:type_name -> ziti.edge_cmd.pb.Mfa.TagsEntry - 62, // 41: ziti.edge_cmd.pb.PostureCheck.tags:type_name -> ziti.edge_cmd.pb.PostureCheck.TagsEntry - 55, // 42: ziti.edge_cmd.pb.PostureCheck.mac:type_name -> ziti.edge_cmd.pb.PostureCheck.Mac - 56, // 43: ziti.edge_cmd.pb.PostureCheck.mfa:type_name -> ziti.edge_cmd.pb.PostureCheck.Mfa - 58, // 44: ziti.edge_cmd.pb.PostureCheck.osList:type_name -> ziti.edge_cmd.pb.PostureCheck.OsList - 59, // 45: ziti.edge_cmd.pb.PostureCheck.process:type_name -> ziti.edge_cmd.pb.PostureCheck.Process - 60, // 46: ziti.edge_cmd.pb.PostureCheck.processMulti:type_name -> ziti.edge_cmd.pb.PostureCheck.ProcessMulti - 61, // 47: ziti.edge_cmd.pb.PostureCheck.domains:type_name -> ziti.edge_cmd.pb.PostureCheck.Domains - 69, // 48: ziti.edge_cmd.pb.Revocation.expiresAt:type_name -> google.protobuf.Timestamp - 63, // 49: ziti.edge_cmd.pb.Revocation.tags:type_name -> ziti.edge_cmd.pb.Revocation.TagsEntry - 64, // 50: ziti.edge_cmd.pb.Service.tags:type_name -> ziti.edge_cmd.pb.Service.TagsEntry - 65, // 51: ziti.edge_cmd.pb.ServiceEdgeRouterPolicy.tags:type_name -> ziti.edge_cmd.pb.ServiceEdgeRouterPolicy.TagsEntry - 66, // 52: ziti.edge_cmd.pb.ServicePolicy.tags:type_name -> ziti.edge_cmd.pb.ServicePolicy.TagsEntry - 67, // 53: ziti.edge_cmd.pb.TransitRouter.tags:type_name -> ziti.edge_cmd.pb.TransitRouter.TagsEntry - 27, // 54: ziti.edge_cmd.pb.CreateTransitRouterCmd.router:type_name -> ziti.edge_cmd.pb.TransitRouter - 16, // 55: ziti.edge_cmd.pb.CreateTransitRouterCmd.enrollment:type_name -> ziti.edge_cmd.pb.Enrollment - 1, // 56: ziti.edge_cmd.pb.CreateTransitRouterCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext - 68, // 57: ziti.edge_cmd.pb.UpdateServiceConfigsCmd.serviceConfigs:type_name -> ziti.edge_cmd.pb.UpdateServiceConfigsCmd.ServiceConfig - 1, // 58: ziti.edge_cmd.pb.UpdateServiceConfigsCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext - 6, // 59: ziti.edge_cmd.pb.JsonMap.ValueEntry.value:type_name -> ziti.edge_cmd.pb.JsonValue - 3, // 60: ziti.edge_cmd.pb.Authenticator.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 38, // 61: ziti.edge_cmd.pb.AuthPolicy.Primary.cert:type_name -> ziti.edge_cmd.pb.AuthPolicy.Primary.Cert - 39, // 62: ziti.edge_cmd.pb.AuthPolicy.Primary.updb:type_name -> ziti.edge_cmd.pb.AuthPolicy.Primary.Updb - 40, // 63: ziti.edge_cmd.pb.AuthPolicy.Primary.extJwt:type_name -> ziti.edge_cmd.pb.AuthPolicy.Primary.ExtJwt - 3, // 64: ziti.edge_cmd.pb.AuthPolicy.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 65: ziti.edge_cmd.pb.Ca.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 66: ziti.edge_cmd.pb.Config.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 67: ziti.edge_cmd.pb.ConfigType.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 68: ziti.edge_cmd.pb.EdgeRouter.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 69: ziti.edge_cmd.pb.EdgeRouterPolicy.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 70: ziti.edge_cmd.pb.Enrollment.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 71: ziti.edge_cmd.pb.ExternalJwtSigner.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 72: ziti.edge_cmd.pb.Identity.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 73: ziti.edge_cmd.pb.Mfa.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 57, // 74: ziti.edge_cmd.pb.PostureCheck.OsList.osList:type_name -> ziti.edge_cmd.pb.PostureCheck.Os - 59, // 75: ziti.edge_cmd.pb.PostureCheck.ProcessMulti.processes:type_name -> ziti.edge_cmd.pb.PostureCheck.Process - 3, // 76: ziti.edge_cmd.pb.PostureCheck.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 77: ziti.edge_cmd.pb.Revocation.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 78: ziti.edge_cmd.pb.Service.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 79: ziti.edge_cmd.pb.ServiceEdgeRouterPolicy.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 80: ziti.edge_cmd.pb.ServicePolicy.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 81: ziti.edge_cmd.pb.TransitRouter.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 82, // [82:82] is the sub-list for method output_type - 82, // [82:82] is the sub-list for method input_type - 82, // [82:82] is the sub-list for extension type_name - 82, // [82:82] is the sub-list for extension extendee - 0, // [0:82] is the sub-list for field type_name + 35, // 6: ziti.edge_cmd.pb.Authenticator.tags:type_name -> ziti.edge_cmd.pb.Authenticator.TagsEntry + 33, // 7: ziti.edge_cmd.pb.Authenticator.cert:type_name -> ziti.edge_cmd.pb.Authenticator.Cert + 34, // 8: ziti.edge_cmd.pb.Authenticator.updb:type_name -> ziti.edge_cmd.pb.Authenticator.Updb + 36, // 9: ziti.edge_cmd.pb.AuthPolicy.primary:type_name -> ziti.edge_cmd.pb.AuthPolicy.Primary + 37, // 10: ziti.edge_cmd.pb.AuthPolicy.secondary:type_name -> ziti.edge_cmd.pb.AuthPolicy.Secondary + 38, // 11: ziti.edge_cmd.pb.AuthPolicy.tags:type_name -> ziti.edge_cmd.pb.AuthPolicy.TagsEntry + 43, // 12: ziti.edge_cmd.pb.Ca.tags:type_name -> ziti.edge_cmd.pb.Ca.TagsEntry + 42, // 13: ziti.edge_cmd.pb.Ca.externalIdClaim:type_name -> ziti.edge_cmd.pb.Ca.ExternalIdClaim + 44, // 14: ziti.edge_cmd.pb.Config.tags:type_name -> ziti.edge_cmd.pb.Config.TagsEntry + 45, // 15: ziti.edge_cmd.pb.ConfigType.tags:type_name -> ziti.edge_cmd.pb.ConfigType.TagsEntry + 71, // 16: ziti.edge_cmd.pb.Controller.lastJoinedAt:type_name -> google.protobuf.Timestamp + 46, // 17: ziti.edge_cmd.pb.Controller.tags:type_name -> ziti.edge_cmd.pb.Controller.TagsEntry + 47, // 18: ziti.edge_cmd.pb.EdgeRouter.tags:type_name -> ziti.edge_cmd.pb.EdgeRouter.TagsEntry + 1, // 19: ziti.edge_cmd.pb.ReEnrollEdgeRouterCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext + 13, // 20: ziti.edge_cmd.pb.CreateEdgeRouterCmd.edgeRouter:type_name -> ziti.edge_cmd.pb.EdgeRouter + 17, // 21: ziti.edge_cmd.pb.CreateEdgeRouterCmd.enrollment:type_name -> ziti.edge_cmd.pb.Enrollment + 1, // 22: ziti.edge_cmd.pb.CreateEdgeRouterCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext + 48, // 23: ziti.edge_cmd.pb.EdgeRouterPolicy.tags:type_name -> ziti.edge_cmd.pb.EdgeRouterPolicy.TagsEntry + 49, // 24: ziti.edge_cmd.pb.Enrollment.tags:type_name -> ziti.edge_cmd.pb.Enrollment.TagsEntry + 71, // 25: ziti.edge_cmd.pb.Enrollment.issuedAt:type_name -> google.protobuf.Timestamp + 71, // 26: ziti.edge_cmd.pb.Enrollment.expiresAt:type_name -> google.protobuf.Timestamp + 7, // 27: ziti.edge_cmd.pb.ReplaceEnrollmentWithAuthenticatorCmd.authenticator:type_name -> ziti.edge_cmd.pb.Authenticator + 1, // 28: ziti.edge_cmd.pb.ReplaceEnrollmentWithAuthenticatorCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext + 50, // 29: ziti.edge_cmd.pb.ExternalJwtSigner.tags:type_name -> ziti.edge_cmd.pb.ExternalJwtSigner.TagsEntry + 71, // 30: ziti.edge_cmd.pb.ExternalJwtSigner.notAfter:type_name -> google.protobuf.Timestamp + 71, // 31: ziti.edge_cmd.pb.ExternalJwtSigner.notBefore:type_name -> google.protobuf.Timestamp + 53, // 32: ziti.edge_cmd.pb.Identity.tags:type_name -> ziti.edge_cmd.pb.Identity.TagsEntry + 51, // 33: ziti.edge_cmd.pb.Identity.envInfo:type_name -> ziti.edge_cmd.pb.Identity.EnvInfo + 52, // 34: ziti.edge_cmd.pb.Identity.sdkInfo:type_name -> ziti.edge_cmd.pb.Identity.SdkInfo + 54, // 35: ziti.edge_cmd.pb.Identity.serviceHostingPrecedences:type_name -> ziti.edge_cmd.pb.Identity.ServiceHostingPrecedencesEntry + 55, // 36: ziti.edge_cmd.pb.Identity.serviceHostingCosts:type_name -> ziti.edge_cmd.pb.Identity.ServiceHostingCostsEntry + 71, // 37: ziti.edge_cmd.pb.Identity.disabledAt:type_name -> google.protobuf.Timestamp + 71, // 38: ziti.edge_cmd.pb.Identity.disabledUntil:type_name -> google.protobuf.Timestamp + 20, // 39: ziti.edge_cmd.pb.CreateIdentityWithEnrollmentsCmd.identity:type_name -> ziti.edge_cmd.pb.Identity + 17, // 40: ziti.edge_cmd.pb.CreateIdentityWithEnrollmentsCmd.enrollments:type_name -> ziti.edge_cmd.pb.Enrollment + 1, // 41: ziti.edge_cmd.pb.CreateIdentityWithEnrollmentsCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext + 56, // 42: ziti.edge_cmd.pb.Mfa.tags:type_name -> ziti.edge_cmd.pb.Mfa.TagsEntry + 64, // 43: ziti.edge_cmd.pb.PostureCheck.tags:type_name -> ziti.edge_cmd.pb.PostureCheck.TagsEntry + 57, // 44: ziti.edge_cmd.pb.PostureCheck.mac:type_name -> ziti.edge_cmd.pb.PostureCheck.Mac + 58, // 45: ziti.edge_cmd.pb.PostureCheck.mfa:type_name -> ziti.edge_cmd.pb.PostureCheck.Mfa + 60, // 46: ziti.edge_cmd.pb.PostureCheck.osList:type_name -> ziti.edge_cmd.pb.PostureCheck.OsList + 61, // 47: ziti.edge_cmd.pb.PostureCheck.process:type_name -> ziti.edge_cmd.pb.PostureCheck.Process + 62, // 48: ziti.edge_cmd.pb.PostureCheck.processMulti:type_name -> ziti.edge_cmd.pb.PostureCheck.ProcessMulti + 63, // 49: ziti.edge_cmd.pb.PostureCheck.domains:type_name -> ziti.edge_cmd.pb.PostureCheck.Domains + 71, // 50: ziti.edge_cmd.pb.Revocation.expiresAt:type_name -> google.protobuf.Timestamp + 65, // 51: ziti.edge_cmd.pb.Revocation.tags:type_name -> ziti.edge_cmd.pb.Revocation.TagsEntry + 66, // 52: ziti.edge_cmd.pb.Service.tags:type_name -> ziti.edge_cmd.pb.Service.TagsEntry + 67, // 53: ziti.edge_cmd.pb.ServiceEdgeRouterPolicy.tags:type_name -> ziti.edge_cmd.pb.ServiceEdgeRouterPolicy.TagsEntry + 68, // 54: ziti.edge_cmd.pb.ServicePolicy.tags:type_name -> ziti.edge_cmd.pb.ServicePolicy.TagsEntry + 69, // 55: ziti.edge_cmd.pb.TransitRouter.tags:type_name -> ziti.edge_cmd.pb.TransitRouter.TagsEntry + 28, // 56: ziti.edge_cmd.pb.CreateTransitRouterCmd.router:type_name -> ziti.edge_cmd.pb.TransitRouter + 17, // 57: ziti.edge_cmd.pb.CreateTransitRouterCmd.enrollment:type_name -> ziti.edge_cmd.pb.Enrollment + 1, // 58: ziti.edge_cmd.pb.CreateTransitRouterCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext + 70, // 59: ziti.edge_cmd.pb.UpdateServiceConfigsCmd.serviceConfigs:type_name -> ziti.edge_cmd.pb.UpdateServiceConfigsCmd.ServiceConfig + 1, // 60: ziti.edge_cmd.pb.UpdateServiceConfigsCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext + 6, // 61: ziti.edge_cmd.pb.JsonMap.ValueEntry.value:type_name -> ziti.edge_cmd.pb.JsonValue + 3, // 62: ziti.edge_cmd.pb.Authenticator.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 39, // 63: ziti.edge_cmd.pb.AuthPolicy.Primary.cert:type_name -> ziti.edge_cmd.pb.AuthPolicy.Primary.Cert + 40, // 64: ziti.edge_cmd.pb.AuthPolicy.Primary.updb:type_name -> ziti.edge_cmd.pb.AuthPolicy.Primary.Updb + 41, // 65: ziti.edge_cmd.pb.AuthPolicy.Primary.extJwt:type_name -> ziti.edge_cmd.pb.AuthPolicy.Primary.ExtJwt + 3, // 66: ziti.edge_cmd.pb.AuthPolicy.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 67: ziti.edge_cmd.pb.Ca.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 68: ziti.edge_cmd.pb.Config.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 69: ziti.edge_cmd.pb.ConfigType.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 70: ziti.edge_cmd.pb.Controller.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 71: ziti.edge_cmd.pb.EdgeRouter.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 72: ziti.edge_cmd.pb.EdgeRouterPolicy.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 73: ziti.edge_cmd.pb.Enrollment.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 74: ziti.edge_cmd.pb.ExternalJwtSigner.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 75: ziti.edge_cmd.pb.Identity.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 76: ziti.edge_cmd.pb.Mfa.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 59, // 77: ziti.edge_cmd.pb.PostureCheck.OsList.osList:type_name -> ziti.edge_cmd.pb.PostureCheck.Os + 61, // 78: ziti.edge_cmd.pb.PostureCheck.ProcessMulti.processes:type_name -> ziti.edge_cmd.pb.PostureCheck.Process + 3, // 79: ziti.edge_cmd.pb.PostureCheck.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 80: ziti.edge_cmd.pb.Revocation.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 81: ziti.edge_cmd.pb.Service.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 82: ziti.edge_cmd.pb.ServiceEdgeRouterPolicy.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 83: ziti.edge_cmd.pb.ServicePolicy.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 84: ziti.edge_cmd.pb.TransitRouter.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 85, // [85:85] is the sub-list for method output_type + 85, // [85:85] is the sub-list for method input_type + 85, // [85:85] is the sub-list for extension type_name + 85, // [85:85] is the sub-list for extension extendee + 0, // [0:85] is the sub-list for field type_name } func init() { file_edge_cmd_proto_init() } @@ -5226,7 +5359,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EdgeRouter); i { + switch v := v.(*Controller); i { case 0: return &v.state case 1: @@ -5238,7 +5371,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReEnrollEdgeRouterCmd); i { + switch v := v.(*EdgeRouter); i { case 0: return &v.state case 1: @@ -5250,7 +5383,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateEdgeRouterCmd); i { + switch v := v.(*ReEnrollEdgeRouterCmd); i { case 0: return &v.state case 1: @@ -5262,7 +5395,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EdgeRouterPolicy); i { + switch v := v.(*CreateEdgeRouterCmd); i { case 0: return &v.state case 1: @@ -5274,7 +5407,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Enrollment); i { + switch v := v.(*EdgeRouterPolicy); i { case 0: return &v.state case 1: @@ -5286,7 +5419,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReplaceEnrollmentWithAuthenticatorCmd); i { + switch v := v.(*Enrollment); i { case 0: return &v.state case 1: @@ -5298,7 +5431,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExternalJwtSigner); i { + switch v := v.(*ReplaceEnrollmentWithAuthenticatorCmd); i { case 0: return &v.state case 1: @@ -5310,7 +5443,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Identity); i { + switch v := v.(*ExternalJwtSigner); i { case 0: return &v.state case 1: @@ -5322,7 +5455,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateIdentityWithEnrollmentsCmd); i { + switch v := v.(*Identity); i { case 0: return &v.state case 1: @@ -5334,7 +5467,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Mfa); i { + switch v := v.(*CreateIdentityWithEnrollmentsCmd); i { case 0: return &v.state case 1: @@ -5346,7 +5479,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostureCheck); i { + switch v := v.(*Mfa); i { case 0: return &v.state case 1: @@ -5358,7 +5491,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Revocation); i { + switch v := v.(*PostureCheck); i { case 0: return &v.state case 1: @@ -5370,7 +5503,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Service); i { + switch v := v.(*Revocation); i { case 0: return &v.state case 1: @@ -5382,7 +5515,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServiceEdgeRouterPolicy); i { + switch v := v.(*Service); i { case 0: return &v.state case 1: @@ -5394,7 +5527,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServicePolicy); i { + switch v := v.(*ServiceEdgeRouterPolicy); i { case 0: return &v.state case 1: @@ -5406,7 +5539,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransitRouter); i { + switch v := v.(*ServicePolicy); i { case 0: return &v.state case 1: @@ -5418,7 +5551,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTransitRouterCmd); i { + switch v := v.(*TransitRouter); i { case 0: return &v.state case 1: @@ -5430,6 +5563,18 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateTransitRouterCmd); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_edge_cmd_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpdateServiceConfigsCmd); i { case 0: return &v.state @@ -5441,7 +5586,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Authenticator_Cert); i { case 0: return &v.state @@ -5453,7 +5598,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Authenticator_Updb); i { case 0: return &v.state @@ -5465,7 +5610,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AuthPolicy_Primary); i { case 0: return &v.state @@ -5477,7 +5622,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AuthPolicy_Secondary); i { case 0: return &v.state @@ -5489,7 +5634,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AuthPolicy_Primary_Cert); i { case 0: return &v.state @@ -5501,7 +5646,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AuthPolicy_Primary_Updb); i { case 0: return &v.state @@ -5513,7 +5658,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AuthPolicy_Primary_ExtJwt); i { case 0: return &v.state @@ -5525,7 +5670,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Ca_ExternalIdClaim); i { case 0: return &v.state @@ -5537,7 +5682,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Identity_EnvInfo); i { case 0: return &v.state @@ -5549,7 +5694,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Identity_SdkInfo); i { case 0: return &v.state @@ -5561,7 +5706,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PostureCheck_Mac); i { case 0: return &v.state @@ -5573,7 +5718,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PostureCheck_Mfa); i { case 0: return &v.state @@ -5585,7 +5730,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PostureCheck_Os); i { case 0: return &v.state @@ -5597,7 +5742,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PostureCheck_OsList); i { case 0: return &v.state @@ -5609,7 +5754,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PostureCheck_Process); i { case 0: return &v.state @@ -5621,7 +5766,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PostureCheck_ProcessMulti); i { case 0: return &v.state @@ -5633,7 +5778,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PostureCheck_Domains); i { case 0: return &v.state @@ -5645,7 +5790,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpdateServiceConfigsCmd_ServiceConfig); i { case 0: return &v.state @@ -5678,11 +5823,11 @@ func file_edge_cmd_proto_init() { (*Authenticator_Updb_)(nil), } file_edge_cmd_proto_msgTypes[8].OneofWrappers = []interface{}{} - file_edge_cmd_proto_msgTypes[11].OneofWrappers = []interface{}{} - file_edge_cmd_proto_msgTypes[15].OneofWrappers = []interface{}{} - file_edge_cmd_proto_msgTypes[17].OneofWrappers = []interface{}{} + file_edge_cmd_proto_msgTypes[12].OneofWrappers = []interface{}{} + file_edge_cmd_proto_msgTypes[16].OneofWrappers = []interface{}{} file_edge_cmd_proto_msgTypes[18].OneofWrappers = []interface{}{} - file_edge_cmd_proto_msgTypes[21].OneofWrappers = []interface{}{ + file_edge_cmd_proto_msgTypes[19].OneofWrappers = []interface{}{} + file_edge_cmd_proto_msgTypes[22].OneofWrappers = []interface{}{ (*PostureCheck_Mac_)(nil), (*PostureCheck_Mfa_)(nil), (*PostureCheck_OsList_)(nil), @@ -5690,15 +5835,15 @@ func file_edge_cmd_proto_init() { (*PostureCheck_ProcessMulti_)(nil), (*PostureCheck_Domains_)(nil), } - file_edge_cmd_proto_msgTypes[26].OneofWrappers = []interface{}{} - file_edge_cmd_proto_msgTypes[35].OneofWrappers = []interface{}{} + file_edge_cmd_proto_msgTypes[27].OneofWrappers = []interface{}{} + file_edge_cmd_proto_msgTypes[36].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_edge_cmd_proto_rawDesc, NumEnums: 1, - NumMessages: 68, + NumMessages: 70, NumExtensions: 0, NumServices: 0, }, diff --git a/common/pb/edge_cmd_pb/edge_cmd.proto b/common/pb/edge_cmd_pb/edge_cmd.proto index e12d6f7e5..99158502b 100644 --- a/common/pb/edge_cmd_pb/edge_cmd.proto +++ b/common/pb/edge_cmd_pb/edge_cmd.proto @@ -165,6 +165,18 @@ message ConfigType { map tags = 4; } +// Controllers +message Controller { + string id = 1; + string name = 2; + string address = 3; + string certPem = 4; + string fingerprint = 5; + bool isOnline = 6; + google.protobuf.Timestamp lastJoinedAt = 7; + map tags = 8; +} + // Edge Routers message EdgeRouter { string id = 1; diff --git a/common/pb/edge_ctrl_pb/README.md b/common/pb/edge_ctrl_pb/README.md index f91e95ae0..fc9480c85 100644 --- a/common/pb/edge_ctrl_pb/README.md +++ b/common/pb/edge_ctrl_pb/README.md @@ -1,6 +1,7 @@ # Prerequisites 1. Install the protoc binary from: https://github.com/protocolbuffers/protobuf/releases + 1. The release should include an `include` folder that needs to be next to the `protoc` binary 2. Install the protoc plugin for Go ```go install google.golang.org/protobuf/cmd/protoc-gen-go@latest``` 3. Ensure ```protoc``` is on your path. 4. Ensure your Go bin directory is on your path @@ -13,11 +14,11 @@ Two options, run the command manually or use `go generate` ## Go Generate 1. Navigate to the root project directory `edge` -2. run `go generate ./pb/edge_ctrl_pb/...` or `go generate .\pb\edge_ctrl_pb\...` +2. run `go generate ./common/pb/edge_ctrl_pb/...` or `go generate \common\pb\edge_ctrl_pb\...` Note: Running a naked `go generate` will trigger all `go:generate` tags in the project, which you most likely do not want ## Manually 1. Navigate to the project root -2. Run: ```protoc -I ./pb/edge_ctrl_pb/ ./pb/edge_ctrl_pb/edge_ctrl.proto --go_out=./pb/edge_ctrl_pb``` +2. Run: ```protoc -I ./common/pb/edge_ctrl_pb/ ./common/pb/edge_ctrl_pb/edge_ctrl.proto --go_out=./pb/edge_ctrl_pb``` diff --git a/common/pb/edge_ctrl_pb/edge_ctrl.pb.go b/common/pb/edge_ctrl_pb/edge_ctrl.pb.go index a50e159cc..fb53e72ea 100644 --- a/common/pb/edge_ctrl_pb/edge_ctrl.pb.go +++ b/common/pb/edge_ctrl_pb/edge_ctrl.pb.go @@ -9,6 +9,7 @@ package edge_ctrl_pb import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" ) @@ -45,7 +46,6 @@ const ( ContentType_RemoveTerminatorResponseType ContentType = 20212 ContentType_ValidateSessionsRequestType ContentType = 20213 ContentType_HealthEventType ContentType = 20214 - ContentType_SigningCertAddedType ContentType = 20215 ContentType_CreateTerminatorV2RequestType ContentType = 20216 ContentType_CreateTerminatorV2ResponseType ContentType = 20217 ContentType_CreateCircuitV2RequestType ContentType = 20218 @@ -67,6 +67,9 @@ const ( ContentType_RemoveTunnelTerminatorRequestType ContentType = 20410 ContentType_RemoveTunnelTerminatorResponseType ContentType = 20411 ContentType_TunnelHealthEventType ContentType = 20412 + ContentType_DataStateType ContentType = 20500 + ContentType_DataStateEventType ContentType = 20501 + ContentType_UpdateTokenType ContentType = 20502 ) // Enum value maps for ContentType. @@ -92,7 +95,6 @@ var ( 20212: "RemoveTerminatorResponseType", 20213: "ValidateSessionsRequestType", 20214: "HealthEventType", - 20215: "SigningCertAddedType", 20216: "CreateTerminatorV2RequestType", 20217: "CreateTerminatorV2ResponseType", 20218: "CreateCircuitV2RequestType", @@ -114,6 +116,9 @@ var ( 20410: "RemoveTunnelTerminatorRequestType", 20411: "RemoveTunnelTerminatorResponseType", 20412: "TunnelHealthEventType", + 20500: "DataStateType", + 20501: "DataStateEventType", + 20502: "UpdateTokenType", } ContentType_value = map[string]int32{ "Zero": 0, @@ -136,7 +141,6 @@ var ( "RemoveTerminatorResponseType": 20212, "ValidateSessionsRequestType": 20213, "HealthEventType": 20214, - "SigningCertAddedType": 20215, "CreateTerminatorV2RequestType": 20216, "CreateTerminatorV2ResponseType": 20217, "CreateCircuitV2RequestType": 20218, @@ -158,6 +162,9 @@ var ( "RemoveTunnelTerminatorRequestType": 20410, "RemoveTunnelTerminatorResponseType": 20411, "TunnelHealthEventType": 20412, + "DataStateType": 20500, + "DataStateEventType": 20501, + "UpdateTokenType": 20502, } ) @@ -237,9 +244,11 @@ func (SessionType) EnumDescriptor() ([]byte, []int) { type Header int32 const ( - Header_HeaderZero Header = 0 - Header_TerminatorId Header = 1022 - Header_CheckPassed Header = 1023 + Header_HeaderZero Header = 0 + Header_TerminatorId Header = 1022 + Header_CheckPassed Header = 1023 + Header_RouterDataModel Header = 1024 + Header_RouterDataModelIndex Header = 1025 ) // Enum value maps for Header. @@ -248,11 +257,15 @@ var ( 0: "HeaderZero", 1022: "TerminatorId", 1023: "CheckPassed", + 1024: "RouterDataModel", + 1025: "RouterDataModelIndex", } Header_value = map[string]int32{ - "HeaderZero": 0, - "TerminatorId": 1022, - "CheckPassed": 1023, + "HeaderZero": 0, + "TerminatorId": 1022, + "CheckPassed": 1023, + "RouterDataModel": 1024, + "RouterDataModelIndex": 1025, } ) @@ -283,55 +296,6 @@ func (Header) EnumDescriptor() ([]byte, []int) { return file_edge_ctrl_proto_rawDescGZIP(), []int{2} } -type ConfigType int32 - -const ( - ConfigType_Add ConfigType = 0 - ConfigType_Remove ConfigType = 1 - ConfigType_Replace ConfigType = 2 -) - -// Enum value maps for ConfigType. -var ( - ConfigType_name = map[int32]string{ - 0: "Add", - 1: "Remove", - 2: "Replace", - } - ConfigType_value = map[string]int32{ - "Add": 0, - "Remove": 1, - "Replace": 2, - } -) - -func (x ConfigType) Enum() *ConfigType { - p := new(ConfigType) - *p = x - return p -} - -func (x ConfigType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ConfigType) Descriptor() protoreflect.EnumDescriptor { - return file_edge_ctrl_proto_enumTypes[3].Descriptor() -} - -func (ConfigType) Type() protoreflect.EnumType { - return &file_edge_ctrl_proto_enumTypes[3] -} - -func (x ConfigType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ConfigType.Descriptor instead. -func (ConfigType) EnumDescriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{3} -} - type TerminatorPrecedence int32 const ( @@ -365,11 +329,11 @@ func (x TerminatorPrecedence) String() string { } func (TerminatorPrecedence) Descriptor() protoreflect.EnumDescriptor { - return file_edge_ctrl_proto_enumTypes[4].Descriptor() + return file_edge_ctrl_proto_enumTypes[3].Descriptor() } func (TerminatorPrecedence) Type() protoreflect.EnumType { - return &file_edge_ctrl_proto_enumTypes[4] + return &file_edge_ctrl_proto_enumTypes[3] } func (x TerminatorPrecedence) Number() protoreflect.EnumNumber { @@ -378,7 +342,7 @@ func (x TerminatorPrecedence) Number() protoreflect.EnumNumber { // Deprecated: Use TerminatorPrecedence.Descriptor instead. func (TerminatorPrecedence) EnumDescriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{4} + return file_edge_ctrl_proto_rawDescGZIP(), []int{3} } type CreateTerminatorResult int32 @@ -417,11 +381,11 @@ func (x CreateTerminatorResult) String() string { } func (CreateTerminatorResult) Descriptor() protoreflect.EnumDescriptor { - return file_edge_ctrl_proto_enumTypes[5].Descriptor() + return file_edge_ctrl_proto_enumTypes[4].Descriptor() } func (CreateTerminatorResult) Type() protoreflect.EnumType { - return &file_edge_ctrl_proto_enumTypes[5] + return &file_edge_ctrl_proto_enumTypes[4] } func (x CreateTerminatorResult) Number() protoreflect.EnumNumber { @@ -430,7 +394,148 @@ func (x CreateTerminatorResult) Number() protoreflect.EnumNumber { // Deprecated: Use CreateTerminatorResult.Descriptor instead. func (CreateTerminatorResult) EnumDescriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{5} + return file_edge_ctrl_proto_rawDescGZIP(), []int{4} +} + +type DataState_Action int32 + +const ( + DataState_Create DataState_Action = 0 + DataState_Update DataState_Action = 1 + DataState_Delete DataState_Action = 2 +) + +// Enum value maps for DataState_Action. +var ( + DataState_Action_name = map[int32]string{ + 0: "Create", + 1: "Update", + 2: "Delete", + } + DataState_Action_value = map[string]int32{ + "Create": 0, + "Update": 1, + "Delete": 2, + } +) + +func (x DataState_Action) Enum() *DataState_Action { + p := new(DataState_Action) + *p = x + return p +} + +func (x DataState_Action) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DataState_Action) Descriptor() protoreflect.EnumDescriptor { + return file_edge_ctrl_proto_enumTypes[5].Descriptor() +} + +func (DataState_Action) Type() protoreflect.EnumType { + return &file_edge_ctrl_proto_enumTypes[5] +} + +func (x DataState_Action) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use DataState_Action.Descriptor instead. +func (DataState_Action) EnumDescriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 0} +} + +type DataState_PublicKey_Usage int32 + +const ( + DataState_PublicKey_JWTValidation DataState_PublicKey_Usage = 0 + DataState_PublicKey_ClientX509CertValidation DataState_PublicKey_Usage = 1 +) + +// Enum value maps for DataState_PublicKey_Usage. +var ( + DataState_PublicKey_Usage_name = map[int32]string{ + 0: "JWTValidation", + 1: "ClientX509CertValidation", + } + DataState_PublicKey_Usage_value = map[string]int32{ + "JWTValidation": 0, + "ClientX509CertValidation": 1, + } +) + +func (x DataState_PublicKey_Usage) Enum() *DataState_PublicKey_Usage { + p := new(DataState_PublicKey_Usage) + *p = x + return p +} + +func (x DataState_PublicKey_Usage) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DataState_PublicKey_Usage) Descriptor() protoreflect.EnumDescriptor { + return file_edge_ctrl_proto_enumTypes[6].Descriptor() +} + +func (DataState_PublicKey_Usage) Type() protoreflect.EnumType { + return &file_edge_ctrl_proto_enumTypes[6] +} + +func (x DataState_PublicKey_Usage) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use DataState_PublicKey_Usage.Descriptor instead. +func (DataState_PublicKey_Usage) EnumDescriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 5, 0} +} + +type DataState_PublicKey_Format int32 + +const ( + DataState_PublicKey_X509CertDer DataState_PublicKey_Format = 0 //x509 cert + DataState_PublicKey_PKIXPublicKey DataState_PublicKey_Format = 1 //asn.1 public key +) + +// Enum value maps for DataState_PublicKey_Format. +var ( + DataState_PublicKey_Format_name = map[int32]string{ + 0: "X509CertDer", + 1: "PKIXPublicKey", + } + DataState_PublicKey_Format_value = map[string]int32{ + "X509CertDer": 0, + "PKIXPublicKey": 1, + } +) + +func (x DataState_PublicKey_Format) Enum() *DataState_PublicKey_Format { + p := new(DataState_PublicKey_Format) + *p = x + return p +} + +func (x DataState_PublicKey_Format) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DataState_PublicKey_Format) Descriptor() protoreflect.EnumDescriptor { + return file_edge_ctrl_proto_enumTypes[7].Descriptor() +} + +func (DataState_PublicKey_Format) Type() protoreflect.EnumType { + return &file_edge_ctrl_proto_enumTypes[7] +} + +func (x DataState_PublicKey_Format) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use DataState_PublicKey_Format.Descriptor instead. +func (DataState_PublicKey_Format) EnumDescriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 5, 1} } type ServerHello struct { @@ -839,23 +944,17 @@ func (x *Service) GetEncryptionRequired() bool { return false } -type Config struct { +type DataState struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - SyncId string `protobuf:"bytes,1,opt,name=syncId,proto3" json:"syncId,omitempty"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` - Type ConfigType `protobuf:"varint,3,opt,name=type,proto3,enum=ziti.edge_ctrl.pb.ConfigType" json:"type,omitempty"` - SignerKeys [][]byte `protobuf:"bytes,4,rep,name=signerKeys,proto3" json:"signerKeys,omitempty"` - Identities []*Identity `protobuf:"bytes,5,rep,name=identities,proto3" json:"identities,omitempty"` - Services []*Service `protobuf:"bytes,6,rep,name=services,proto3" json:"services,omitempty"` - PostureSet []*PostureSet `protobuf:"bytes,7,rep,name=postureSet,proto3" json:"postureSet,omitempty"` - PostureChecks []*PostureCheck `protobuf:"bytes,8,rep,name=postureChecks,proto3" json:"postureChecks,omitempty"` + Events []*DataState_Event `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` + EndIndex uint64 `protobuf:"varint,2,opt,name=endIndex,proto3" json:"endIndex,omitempty"` } -func (x *Config) Reset() { - *x = Config{} +func (x *DataState) Reset() { + *x = DataState{} if protoimpl.UnsafeEnabled { mi := &file_edge_ctrl_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -863,13 +962,13 @@ func (x *Config) Reset() { } } -func (x *Config) String() string { +func (x *DataState) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Config) ProtoMessage() {} +func (*DataState) ProtoMessage() {} -func (x *Config) ProtoReflect() protoreflect.Message { +func (x *DataState) ProtoReflect() protoreflect.Message { mi := &file_edge_ctrl_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -881,77 +980,41 @@ func (x *Config) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Config.ProtoReflect.Descriptor instead. -func (*Config) Descriptor() ([]byte, []int) { +// Deprecated: Use DataState.ProtoReflect.Descriptor instead. +func (*DataState) Descriptor() ([]byte, []int) { return file_edge_ctrl_proto_rawDescGZIP(), []int{6} } -func (x *Config) GetSyncId() string { - if x != nil { - return x.SyncId - } - return "" -} - -func (x *Config) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *Config) GetType() ConfigType { +func (x *DataState) GetEvents() []*DataState_Event { if x != nil { - return x.Type - } - return ConfigType_Add -} - -func (x *Config) GetSignerKeys() [][]byte { - if x != nil { - return x.SignerKeys - } - return nil -} - -func (x *Config) GetIdentities() []*Identity { - if x != nil { - return x.Identities - } - return nil -} - -func (x *Config) GetServices() []*Service { - if x != nil { - return x.Services + return x.Events } return nil } -func (x *Config) GetPostureSet() []*PostureSet { +func (x *DataState) GetEndIndex() uint64 { if x != nil { - return x.PostureSet + return x.EndIndex } - return nil -} - -func (x *Config) GetPostureChecks() []*PostureCheck { - if x != nil { - return x.PostureChecks - } - return nil + return 0 } -type SignerCerts struct { +type Session struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Keys [][]byte `protobuf:"bytes,1,rep,name=keys,proto3" json:"keys,omitempty"` + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + Type SessionType `protobuf:"varint,2,opt,name=type,proto3,enum=ziti.edge_ctrl.pb.SessionType" json:"type,omitempty"` + CertFingerprints []string `protobuf:"bytes,3,rep,name=certFingerprints,proto3" json:"certFingerprints,omitempty"` + Urls []string `protobuf:"bytes,4,rep,name=urls,proto3" json:"urls,omitempty"` + Service *Service `protobuf:"bytes,5,opt,name=service,proto3" json:"service,omitempty"` + Id string `protobuf:"bytes,7,opt,name=id,proto3" json:"id,omitempty"` + ApiSessionId string `protobuf:"bytes,8,opt,name=apiSessionId,proto3" json:"apiSessionId,omitempty"` } -func (x *SignerCerts) Reset() { - *x = SignerCerts{} +func (x *Session) Reset() { + *x = Session{} if protoimpl.UnsafeEnabled { mi := &file_edge_ctrl_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -959,13 +1022,13 @@ func (x *SignerCerts) Reset() { } } -func (x *SignerCerts) String() string { +func (x *Session) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SignerCerts) ProtoMessage() {} +func (*Session) ProtoMessage() {} -func (x *SignerCerts) ProtoReflect() protoreflect.Message { +func (x *Session) ProtoReflect() protoreflect.Message { mi := &file_edge_ctrl_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -977,30 +1040,72 @@ func (x *SignerCerts) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SignerCerts.ProtoReflect.Descriptor instead. -func (*SignerCerts) Descriptor() ([]byte, []int) { +// Deprecated: Use Session.ProtoReflect.Descriptor instead. +func (*Session) Descriptor() ([]byte, []int) { return file_edge_ctrl_proto_rawDescGZIP(), []int{7} } -func (x *SignerCerts) GetKeys() [][]byte { +func (x *Session) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +func (x *Session) GetType() SessionType { + if x != nil { + return x.Type + } + return SessionType_Dial +} + +func (x *Session) GetCertFingerprints() []string { + if x != nil { + return x.CertFingerprints + } + return nil +} + +func (x *Session) GetUrls() []string { + if x != nil { + return x.Urls + } + return nil +} + +func (x *Session) GetService() *Service { if x != nil { - return x.Keys + return x.Service } return nil } -type Identity struct { +func (x *Session) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *Session) GetApiSessionId() string { + if x != nil { + return x.ApiSessionId + } + return "" +} + +type ApiSession struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - ServiceIds []string `protobuf:"bytes,3,rep,name=serviceIds,proto3" json:"serviceIds,omitempty"` + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + CertFingerprints []string `protobuf:"bytes,2,rep,name=certFingerprints,proto3" json:"certFingerprints,omitempty"` + Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` } -func (x *Identity) Reset() { - *x = Identity{} +func (x *ApiSession) Reset() { + *x = ApiSession{} if protoimpl.UnsafeEnabled { mi := &file_edge_ctrl_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1008,13 +1113,13 @@ func (x *Identity) Reset() { } } -func (x *Identity) String() string { +func (x *ApiSession) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Identity) ProtoMessage() {} +func (*ApiSession) ProtoMessage() {} -func (x *Identity) ProtoReflect() protoreflect.Message { +func (x *ApiSession) ProtoReflect() protoreflect.Message { mi := &file_edge_ctrl_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1026,44 +1131,43 @@ func (x *Identity) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Identity.ProtoReflect.Descriptor instead. -func (*Identity) Descriptor() ([]byte, []int) { +// Deprecated: Use ApiSession.ProtoReflect.Descriptor instead. +func (*ApiSession) Descriptor() ([]byte, []int) { return file_edge_ctrl_proto_rawDescGZIP(), []int{8} } -func (x *Identity) GetId() string { +func (x *ApiSession) GetToken() string { if x != nil { - return x.Id + return x.Token } return "" } -func (x *Identity) GetName() string { +func (x *ApiSession) GetCertFingerprints() []string { if x != nil { - return x.Name + return x.CertFingerprints } - return "" + return nil } -func (x *Identity) GetServiceIds() []string { +func (x *ApiSession) GetId() string { if x != nil { - return x.ServiceIds + return x.Id } - return nil + return "" } -type PostureSet struct { +type ApiSessionAdded struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - PostureCheckIds []string `protobuf:"bytes,3,rep,name=postureCheckIds,proto3" json:"postureCheckIds,omitempty"` + IsFullState bool `protobuf:"varint,1,opt,name=isFullState,proto3" json:"isFullState,omitempty"` + ApiSessions []*ApiSession `protobuf:"bytes,2,rep,name=apiSessions,proto3" json:"apiSessions,omitempty"` } -func (x *PostureSet) Reset() { - *x = PostureSet{} +func (x *ApiSessionAdded) Reset() { + *x = ApiSessionAdded{} if protoimpl.UnsafeEnabled { mi := &file_edge_ctrl_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1071,13 +1175,13 @@ func (x *PostureSet) Reset() { } } -func (x *PostureSet) String() string { +func (x *ApiSessionAdded) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PostureSet) ProtoMessage() {} +func (*ApiSessionAdded) ProtoMessage() {} -func (x *PostureSet) ProtoReflect() protoreflect.Message { +func (x *ApiSessionAdded) ProtoReflect() protoreflect.Message { mi := &file_edge_ctrl_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1089,44 +1193,35 @@ func (x *PostureSet) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PostureSet.ProtoReflect.Descriptor instead. -func (*PostureSet) Descriptor() ([]byte, []int) { +// Deprecated: Use ApiSessionAdded.ProtoReflect.Descriptor instead. +func (*ApiSessionAdded) Descriptor() ([]byte, []int) { return file_edge_ctrl_proto_rawDescGZIP(), []int{9} } -func (x *PostureSet) GetId() string { +func (x *ApiSessionAdded) GetIsFullState() bool { if x != nil { - return x.Id + return x.IsFullState } - return "" + return false } -func (x *PostureSet) GetName() string { +func (x *ApiSessionAdded) GetApiSessions() []*ApiSession { if x != nil { - return x.Name + return x.ApiSessions } - return "" + return nil } -func (x *PostureSet) GetPostureCheckIds() []string { - if x != nil { - return x.PostureCheckIds - } - return nil -} - -type PostureCheck struct { +type ApiSessionUpdated struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` - Data map[string][]byte `protobuf:"bytes,3,rep,name=data,proto3" json:"data,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ApiSessions []*ApiSession `protobuf:"bytes,1,rep,name=apiSessions,proto3" json:"apiSessions,omitempty"` } -func (x *PostureCheck) Reset() { - *x = PostureCheck{} +func (x *ApiSessionUpdated) Reset() { + *x = ApiSessionUpdated{} if protoimpl.UnsafeEnabled { mi := &file_edge_ctrl_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1134,13 +1229,13 @@ func (x *PostureCheck) Reset() { } } -func (x *PostureCheck) String() string { +func (x *ApiSessionUpdated) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PostureCheck) ProtoMessage() {} +func (*ApiSessionUpdated) ProtoMessage() {} -func (x *PostureCheck) ProtoReflect() protoreflect.Message { +func (x *ApiSessionUpdated) ProtoReflect() protoreflect.Message { mi := &file_edge_ctrl_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1152,48 +1247,29 @@ func (x *PostureCheck) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PostureCheck.ProtoReflect.Descriptor instead. -func (*PostureCheck) Descriptor() ([]byte, []int) { +// Deprecated: Use ApiSessionUpdated.ProtoReflect.Descriptor instead. +func (*ApiSessionUpdated) Descriptor() ([]byte, []int) { return file_edge_ctrl_proto_rawDescGZIP(), []int{10} } -func (x *PostureCheck) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *PostureCheck) GetType() string { - if x != nil { - return x.Type - } - return "" -} - -func (x *PostureCheck) GetData() map[string][]byte { +func (x *ApiSessionUpdated) GetApiSessions() []*ApiSession { if x != nil { - return x.Data + return x.ApiSessions } return nil } -type Session struct { +type ApiSessionRemoved struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` - Type SessionType `protobuf:"varint,2,opt,name=type,proto3,enum=ziti.edge_ctrl.pb.SessionType" json:"type,omitempty"` - CertFingerprints []string `protobuf:"bytes,3,rep,name=certFingerprints,proto3" json:"certFingerprints,omitempty"` - Urls []string `protobuf:"bytes,4,rep,name=urls,proto3" json:"urls,omitempty"` - Service *Service `protobuf:"bytes,5,opt,name=service,proto3" json:"service,omitempty"` - Id string `protobuf:"bytes,7,opt,name=id,proto3" json:"id,omitempty"` - ApiSessionId string `protobuf:"bytes,8,opt,name=apiSessionId,proto3" json:"apiSessionId,omitempty"` + Tokens []string `protobuf:"bytes,1,rep,name=tokens,proto3" json:"tokens,omitempty"` + Ids []string `protobuf:"bytes,2,rep,name=ids,proto3" json:"ids,omitempty"` } -func (x *Session) Reset() { - *x = Session{} +func (x *ApiSessionRemoved) Reset() { + *x = ApiSessionRemoved{} if protoimpl.UnsafeEnabled { mi := &file_edge_ctrl_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1201,13 +1277,13 @@ func (x *Session) Reset() { } } -func (x *Session) String() string { +func (x *ApiSessionRemoved) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Session) ProtoMessage() {} +func (*ApiSessionRemoved) ProtoMessage() {} -func (x *Session) ProtoReflect() protoreflect.Message { +func (x *ApiSessionRemoved) ProtoReflect() protoreflect.Message { mi := &file_edge_ctrl_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1219,72 +1295,35 @@ func (x *Session) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Session.ProtoReflect.Descriptor instead. -func (*Session) Descriptor() ([]byte, []int) { +// Deprecated: Use ApiSessionRemoved.ProtoReflect.Descriptor instead. +func (*ApiSessionRemoved) Descriptor() ([]byte, []int) { return file_edge_ctrl_proto_rawDescGZIP(), []int{11} } -func (x *Session) GetToken() string { - if x != nil { - return x.Token - } - return "" -} - -func (x *Session) GetType() SessionType { - if x != nil { - return x.Type - } - return SessionType_Dial -} - -func (x *Session) GetCertFingerprints() []string { - if x != nil { - return x.CertFingerprints - } - return nil -} - -func (x *Session) GetUrls() []string { +func (x *ApiSessionRemoved) GetTokens() []string { if x != nil { - return x.Urls + return x.Tokens } return nil } -func (x *Session) GetService() *Service { +func (x *ApiSessionRemoved) GetIds() []string { if x != nil { - return x.Service + return x.Ids } return nil } -func (x *Session) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *Session) GetApiSessionId() string { - if x != nil { - return x.ApiSessionId - } - return "" -} - -type ApiSession struct { +type ApiSessionHeartbeat struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` - CertFingerprints []string `protobuf:"bytes,2,rep,name=certFingerprints,proto3" json:"certFingerprints,omitempty"` - Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` + Tokens []string `protobuf:"bytes,1,rep,name=tokens,proto3" json:"tokens,omitempty"` } -func (x *ApiSession) Reset() { - *x = ApiSession{} +func (x *ApiSessionHeartbeat) Reset() { + *x = ApiSessionHeartbeat{} if protoimpl.UnsafeEnabled { mi := &file_edge_ctrl_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1292,13 +1331,13 @@ func (x *ApiSession) Reset() { } } -func (x *ApiSession) String() string { +func (x *ApiSessionHeartbeat) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ApiSession) ProtoMessage() {} +func (*ApiSessionHeartbeat) ProtoMessage() {} -func (x *ApiSession) ProtoReflect() protoreflect.Message { +func (x *ApiSessionHeartbeat) ProtoReflect() protoreflect.Message { mi := &file_edge_ctrl_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1310,43 +1349,29 @@ func (x *ApiSession) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ApiSession.ProtoReflect.Descriptor instead. -func (*ApiSession) Descriptor() ([]byte, []int) { +// Deprecated: Use ApiSessionHeartbeat.ProtoReflect.Descriptor instead. +func (*ApiSessionHeartbeat) Descriptor() ([]byte, []int) { return file_edge_ctrl_proto_rawDescGZIP(), []int{12} } -func (x *ApiSession) GetToken() string { - if x != nil { - return x.Token - } - return "" -} - -func (x *ApiSession) GetCertFingerprints() []string { +func (x *ApiSessionHeartbeat) GetTokens() []string { if x != nil { - return x.CertFingerprints + return x.Tokens } return nil } -func (x *ApiSession) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -type ApiSessionAdded struct { +type SessionRemoved struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - IsFullState bool `protobuf:"varint,1,opt,name=isFullState,proto3" json:"isFullState,omitempty"` - ApiSessions []*ApiSession `protobuf:"bytes,2,rep,name=apiSessions,proto3" json:"apiSessions,omitempty"` + Tokens []string `protobuf:"bytes,1,rep,name=tokens,proto3" json:"tokens,omitempty"` + Ids []string `protobuf:"bytes,2,rep,name=ids,proto3" json:"ids,omitempty"` } -func (x *ApiSessionAdded) Reset() { - *x = ApiSessionAdded{} +func (x *SessionRemoved) Reset() { + *x = SessionRemoved{} if protoimpl.UnsafeEnabled { mi := &file_edge_ctrl_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1354,13 +1379,13 @@ func (x *ApiSessionAdded) Reset() { } } -func (x *ApiSessionAdded) String() string { +func (x *SessionRemoved) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ApiSessionAdded) ProtoMessage() {} +func (*SessionRemoved) ProtoMessage() {} -func (x *ApiSessionAdded) ProtoReflect() protoreflect.Message { +func (x *SessionRemoved) ProtoReflect() protoreflect.Message { mi := &file_edge_ctrl_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1372,35 +1397,35 @@ func (x *ApiSessionAdded) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ApiSessionAdded.ProtoReflect.Descriptor instead. -func (*ApiSessionAdded) Descriptor() ([]byte, []int) { +// Deprecated: Use SessionRemoved.ProtoReflect.Descriptor instead. +func (*SessionRemoved) Descriptor() ([]byte, []int) { return file_edge_ctrl_proto_rawDescGZIP(), []int{13} } -func (x *ApiSessionAdded) GetIsFullState() bool { +func (x *SessionRemoved) GetTokens() []string { if x != nil { - return x.IsFullState + return x.Tokens } - return false + return nil } -func (x *ApiSessionAdded) GetApiSessions() []*ApiSession { +func (x *SessionRemoved) GetIds() []string { if x != nil { - return x.ApiSessions + return x.Ids } return nil } -type ApiSessionUpdated struct { +type RequestClientReSync struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ApiSessions []*ApiSession `protobuf:"bytes,1,rep,name=apiSessions,proto3" json:"apiSessions,omitempty"` + Reason string `protobuf:"bytes,1,opt,name=reason,proto3" json:"reason,omitempty"` } -func (x *ApiSessionUpdated) Reset() { - *x = ApiSessionUpdated{} +func (x *RequestClientReSync) Reset() { + *x = RequestClientReSync{} if protoimpl.UnsafeEnabled { mi := &file_edge_ctrl_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1408,13 +1433,13 @@ func (x *ApiSessionUpdated) Reset() { } } -func (x *ApiSessionUpdated) String() string { +func (x *RequestClientReSync) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ApiSessionUpdated) ProtoMessage() {} +func (*RequestClientReSync) ProtoMessage() {} -func (x *ApiSessionUpdated) ProtoReflect() protoreflect.Message { +func (x *RequestClientReSync) ProtoReflect() protoreflect.Message { mi := &file_edge_ctrl_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1426,29 +1451,32 @@ func (x *ApiSessionUpdated) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ApiSessionUpdated.ProtoReflect.Descriptor instead. -func (*ApiSessionUpdated) Descriptor() ([]byte, []int) { +// Deprecated: Use RequestClientReSync.ProtoReflect.Descriptor instead. +func (*RequestClientReSync) Descriptor() ([]byte, []int) { return file_edge_ctrl_proto_rawDescGZIP(), []int{14} } -func (x *ApiSessionUpdated) GetApiSessions() []*ApiSession { +func (x *RequestClientReSync) GetReason() string { if x != nil { - return x.ApiSessions + return x.Reason } - return nil + return "" } -type ApiSessionRemoved struct { +type CreateCircuitRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Tokens []string `protobuf:"bytes,1,rep,name=tokens,proto3" json:"tokens,omitempty"` - Ids []string `protobuf:"bytes,2,rep,name=ids,proto3" json:"ids,omitempty"` + SessionToken string `protobuf:"bytes,1,opt,name=sessionToken,proto3" json:"sessionToken,omitempty"` + Fingerprints []string `protobuf:"bytes,2,rep,name=fingerprints,proto3" json:"fingerprints,omitempty"` + TerminatorInstanceId string `protobuf:"bytes,3,opt,name=terminatorInstanceId,proto3" json:"terminatorInstanceId,omitempty"` + PeerData map[uint32][]byte `protobuf:"bytes,4,rep,name=peerData,proto3" json:"peerData,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ApiSessionToken string `protobuf:"bytes,5,opt,name=apiSessionToken,proto3" json:"apiSessionToken,omitempty"` } -func (x *ApiSessionRemoved) Reset() { - *x = ApiSessionRemoved{} +func (x *CreateCircuitRequest) Reset() { + *x = CreateCircuitRequest{} if protoimpl.UnsafeEnabled { mi := &file_edge_ctrl_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1456,13 +1484,13 @@ func (x *ApiSessionRemoved) Reset() { } } -func (x *ApiSessionRemoved) String() string { +func (x *CreateCircuitRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ApiSessionRemoved) ProtoMessage() {} +func (*CreateCircuitRequest) ProtoMessage() {} -func (x *ApiSessionRemoved) ProtoReflect() protoreflect.Message { +func (x *CreateCircuitRequest) ProtoReflect() protoreflect.Message { mi := &file_edge_ctrl_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1474,35 +1502,59 @@ func (x *ApiSessionRemoved) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ApiSessionRemoved.ProtoReflect.Descriptor instead. -func (*ApiSessionRemoved) Descriptor() ([]byte, []int) { +// Deprecated: Use CreateCircuitRequest.ProtoReflect.Descriptor instead. +func (*CreateCircuitRequest) Descriptor() ([]byte, []int) { return file_edge_ctrl_proto_rawDescGZIP(), []int{15} } -func (x *ApiSessionRemoved) GetTokens() []string { +func (x *CreateCircuitRequest) GetSessionToken() string { if x != nil { - return x.Tokens + return x.SessionToken + } + return "" +} + +func (x *CreateCircuitRequest) GetFingerprints() []string { + if x != nil { + return x.Fingerprints } return nil } -func (x *ApiSessionRemoved) GetIds() []string { +func (x *CreateCircuitRequest) GetTerminatorInstanceId() string { if x != nil { - return x.Ids + return x.TerminatorInstanceId + } + return "" +} + +func (x *CreateCircuitRequest) GetPeerData() map[uint32][]byte { + if x != nil { + return x.PeerData } return nil } -type ApiSessionHeartbeat struct { +func (x *CreateCircuitRequest) GetApiSessionToken() string { + if x != nil { + return x.ApiSessionToken + } + return "" +} + +type CreateCircuitResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Tokens []string `protobuf:"bytes,1,rep,name=tokens,proto3" json:"tokens,omitempty"` + CircuitId string `protobuf:"bytes,1,opt,name=circuitId,proto3" json:"circuitId,omitempty"` + Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` + PeerData map[uint32][]byte `protobuf:"bytes,3,rep,name=peerData,proto3" json:"peerData,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Tags map[string]string `protobuf:"bytes,4,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (x *ApiSessionHeartbeat) Reset() { - *x = ApiSessionHeartbeat{} +func (x *CreateCircuitResponse) Reset() { + *x = CreateCircuitResponse{} if protoimpl.UnsafeEnabled { mi := &file_edge_ctrl_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1510,13 +1562,13 @@ func (x *ApiSessionHeartbeat) Reset() { } } -func (x *ApiSessionHeartbeat) String() string { +func (x *CreateCircuitResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ApiSessionHeartbeat) ProtoMessage() {} +func (*CreateCircuitResponse) ProtoMessage() {} -func (x *ApiSessionHeartbeat) ProtoReflect() protoreflect.Message { +func (x *CreateCircuitResponse) ProtoReflect() protoreflect.Message { mi := &file_edge_ctrl_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1528,232 +1580,9 @@ func (x *ApiSessionHeartbeat) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ApiSessionHeartbeat.ProtoReflect.Descriptor instead. -func (*ApiSessionHeartbeat) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{16} -} - -func (x *ApiSessionHeartbeat) GetTokens() []string { - if x != nil { - return x.Tokens - } - return nil -} - -type SessionRemoved struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Tokens []string `protobuf:"bytes,1,rep,name=tokens,proto3" json:"tokens,omitempty"` - Ids []string `protobuf:"bytes,2,rep,name=ids,proto3" json:"ids,omitempty"` -} - -func (x *SessionRemoved) Reset() { - *x = SessionRemoved{} - if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SessionRemoved) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SessionRemoved) ProtoMessage() {} - -func (x *SessionRemoved) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_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 SessionRemoved.ProtoReflect.Descriptor instead. -func (*SessionRemoved) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{17} -} - -func (x *SessionRemoved) GetTokens() []string { - if x != nil { - return x.Tokens - } - return nil -} - -func (x *SessionRemoved) GetIds() []string { - if x != nil { - return x.Ids - } - return nil -} - -type RequestClientReSync struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Reason string `protobuf:"bytes,1,opt,name=reason,proto3" json:"reason,omitempty"` -} - -func (x *RequestClientReSync) Reset() { - *x = RequestClientReSync{} - if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RequestClientReSync) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RequestClientReSync) ProtoMessage() {} - -func (x *RequestClientReSync) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_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 RequestClientReSync.ProtoReflect.Descriptor instead. -func (*RequestClientReSync) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{18} -} - -func (x *RequestClientReSync) GetReason() string { - if x != nil { - return x.Reason - } - return "" -} - -type CreateCircuitRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - SessionToken string `protobuf:"bytes,1,opt,name=sessionToken,proto3" json:"sessionToken,omitempty"` - Fingerprints []string `protobuf:"bytes,2,rep,name=fingerprints,proto3" json:"fingerprints,omitempty"` - TerminatorInstanceId string `protobuf:"bytes,3,opt,name=terminatorInstanceId,proto3" json:"terminatorInstanceId,omitempty"` - PeerData map[uint32][]byte `protobuf:"bytes,4,rep,name=peerData,proto3" json:"peerData,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` -} - -func (x *CreateCircuitRequest) Reset() { - *x = CreateCircuitRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CreateCircuitRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CreateCircuitRequest) ProtoMessage() {} - -func (x *CreateCircuitRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_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 CreateCircuitRequest.ProtoReflect.Descriptor instead. -func (*CreateCircuitRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{19} -} - -func (x *CreateCircuitRequest) GetSessionToken() string { - if x != nil { - return x.SessionToken - } - return "" -} - -func (x *CreateCircuitRequest) GetFingerprints() []string { - if x != nil { - return x.Fingerprints - } - return nil -} - -func (x *CreateCircuitRequest) GetTerminatorInstanceId() string { - if x != nil { - return x.TerminatorInstanceId - } - return "" -} - -func (x *CreateCircuitRequest) GetPeerData() map[uint32][]byte { - if x != nil { - return x.PeerData - } - return nil -} - -type CreateCircuitResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - CircuitId string `protobuf:"bytes,1,opt,name=circuitId,proto3" json:"circuitId,omitempty"` - Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` - PeerData map[uint32][]byte `protobuf:"bytes,3,rep,name=peerData,proto3" json:"peerData,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Tags map[string]string `protobuf:"bytes,4,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` -} - -func (x *CreateCircuitResponse) Reset() { - *x = CreateCircuitResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CreateCircuitResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CreateCircuitResponse) ProtoMessage() {} - -func (x *CreateCircuitResponse) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_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 CreateCircuitResponse.ProtoReflect.Descriptor instead. func (*CreateCircuitResponse) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{20} + return file_edge_ctrl_proto_rawDescGZIP(), []int{16} } func (x *CreateCircuitResponse) GetCircuitId() string { @@ -1789,19 +1618,20 @@ type CreateTerminatorRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - SessionToken string `protobuf:"bytes,1,opt,name=sessionToken,proto3" json:"sessionToken,omitempty"` - Fingerprints []string `protobuf:"bytes,2,rep,name=fingerprints,proto3" json:"fingerprints,omitempty"` - PeerData map[uint32][]byte `protobuf:"bytes,3,rep,name=peerData,proto3" json:"peerData,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Cost uint32 `protobuf:"varint,4,opt,name=cost,proto3" json:"cost,omitempty"` - Precedence TerminatorPrecedence `protobuf:"varint,5,opt,name=precedence,proto3,enum=ziti.edge_ctrl.pb.TerminatorPrecedence" json:"precedence,omitempty"` - InstanceId string `protobuf:"bytes,6,opt,name=instanceId,proto3" json:"instanceId,omitempty"` - InstanceSecret []byte `protobuf:"bytes,7,opt,name=instanceSecret,proto3" json:"instanceSecret,omitempty"` + SessionToken string `protobuf:"bytes,1,opt,name=sessionToken,proto3" json:"sessionToken,omitempty"` + Fingerprints []string `protobuf:"bytes,2,rep,name=fingerprints,proto3" json:"fingerprints,omitempty"` + PeerData map[uint32][]byte `protobuf:"bytes,3,rep,name=peerData,proto3" json:"peerData,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Cost uint32 `protobuf:"varint,4,opt,name=cost,proto3" json:"cost,omitempty"` + Precedence TerminatorPrecedence `protobuf:"varint,5,opt,name=precedence,proto3,enum=ziti.edge_ctrl.pb.TerminatorPrecedence" json:"precedence,omitempty"` + InstanceId string `protobuf:"bytes,6,opt,name=instanceId,proto3" json:"instanceId,omitempty"` + InstanceSecret []byte `protobuf:"bytes,7,opt,name=instanceSecret,proto3" json:"instanceSecret,omitempty"` + ApiSessionToken string `protobuf:"bytes,8,opt,name=apiSessionToken,proto3" json:"apiSessionToken,omitempty"` } func (x *CreateTerminatorRequest) Reset() { *x = CreateTerminatorRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[21] + mi := &file_edge_ctrl_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1814,7 +1644,7 @@ func (x *CreateTerminatorRequest) String() string { func (*CreateTerminatorRequest) ProtoMessage() {} func (x *CreateTerminatorRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[21] + mi := &file_edge_ctrl_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1827,7 +1657,7 @@ func (x *CreateTerminatorRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTerminatorRequest.ProtoReflect.Descriptor instead. func (*CreateTerminatorRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{21} + return file_edge_ctrl_proto_rawDescGZIP(), []int{17} } func (x *CreateTerminatorRequest) GetSessionToken() string { @@ -1879,25 +1709,33 @@ func (x *CreateTerminatorRequest) GetInstanceSecret() []byte { return nil } +func (x *CreateTerminatorRequest) GetApiSessionToken() string { + if x != nil { + return x.ApiSessionToken + } + return "" +} + type CreateTerminatorV2Request struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` - SessionToken string `protobuf:"bytes,2,opt,name=sessionToken,proto3" json:"sessionToken,omitempty"` - Fingerprints []string `protobuf:"bytes,3,rep,name=fingerprints,proto3" json:"fingerprints,omitempty"` - PeerData map[uint32][]byte `protobuf:"bytes,4,rep,name=peerData,proto3" json:"peerData,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Cost uint32 `protobuf:"varint,5,opt,name=cost,proto3" json:"cost,omitempty"` - Precedence TerminatorPrecedence `protobuf:"varint,6,opt,name=precedence,proto3,enum=ziti.edge_ctrl.pb.TerminatorPrecedence" json:"precedence,omitempty"` - InstanceId string `protobuf:"bytes,7,opt,name=instanceId,proto3" json:"instanceId,omitempty"` - InstanceSecret []byte `protobuf:"bytes,8,opt,name=instanceSecret,proto3" json:"instanceSecret,omitempty"` + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + SessionToken string `protobuf:"bytes,2,opt,name=sessionToken,proto3" json:"sessionToken,omitempty"` + Fingerprints []string `protobuf:"bytes,3,rep,name=fingerprints,proto3" json:"fingerprints,omitempty"` + PeerData map[uint32][]byte `protobuf:"bytes,4,rep,name=peerData,proto3" json:"peerData,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Cost uint32 `protobuf:"varint,5,opt,name=cost,proto3" json:"cost,omitempty"` + Precedence TerminatorPrecedence `protobuf:"varint,6,opt,name=precedence,proto3,enum=ziti.edge_ctrl.pb.TerminatorPrecedence" json:"precedence,omitempty"` + InstanceId string `protobuf:"bytes,7,opt,name=instanceId,proto3" json:"instanceId,omitempty"` + InstanceSecret []byte `protobuf:"bytes,8,opt,name=instanceSecret,proto3" json:"instanceSecret,omitempty"` + ApiSessionToken string `protobuf:"bytes,9,opt,name=apiSessionToken,proto3" json:"apiSessionToken,omitempty"` } func (x *CreateTerminatorV2Request) Reset() { *x = CreateTerminatorV2Request{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[22] + mi := &file_edge_ctrl_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1910,7 +1748,7 @@ func (x *CreateTerminatorV2Request) String() string { func (*CreateTerminatorV2Request) ProtoMessage() {} func (x *CreateTerminatorV2Request) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[22] + mi := &file_edge_ctrl_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1923,7 +1761,7 @@ func (x *CreateTerminatorV2Request) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTerminatorV2Request.ProtoReflect.Descriptor instead. func (*CreateTerminatorV2Request) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{22} + return file_edge_ctrl_proto_rawDescGZIP(), []int{18} } func (x *CreateTerminatorV2Request) GetAddress() string { @@ -1982,6 +1820,13 @@ func (x *CreateTerminatorV2Request) GetInstanceSecret() []byte { return nil } +func (x *CreateTerminatorV2Request) GetApiSessionToken() string { + if x != nil { + return x.ApiSessionToken + } + return "" +} + type CreateTerminatorV2Response struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1995,7 +1840,7 @@ type CreateTerminatorV2Response struct { func (x *CreateTerminatorV2Response) Reset() { *x = CreateTerminatorV2Response{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[23] + mi := &file_edge_ctrl_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2008,7 +1853,7 @@ func (x *CreateTerminatorV2Response) String() string { func (*CreateTerminatorV2Response) ProtoMessage() {} func (x *CreateTerminatorV2Response) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[23] + mi := &file_edge_ctrl_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2021,7 +1866,7 @@ func (x *CreateTerminatorV2Response) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTerminatorV2Response.ProtoReflect.Descriptor instead. func (*CreateTerminatorV2Response) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{23} + return file_edge_ctrl_proto_rawDescGZIP(), []int{19} } func (x *CreateTerminatorV2Response) GetTerminatorId() string { @@ -2050,15 +1895,16 @@ type RemoveTerminatorRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - SessionToken string `protobuf:"bytes,1,opt,name=sessionToken,proto3" json:"sessionToken,omitempty"` - Fingerprints []string `protobuf:"bytes,2,rep,name=fingerprints,proto3" json:"fingerprints,omitempty"` - TerminatorId string `protobuf:"bytes,3,opt,name=terminatorId,proto3" json:"terminatorId,omitempty"` + SessionToken string `protobuf:"bytes,1,opt,name=sessionToken,proto3" json:"sessionToken,omitempty"` + Fingerprints []string `protobuf:"bytes,2,rep,name=fingerprints,proto3" json:"fingerprints,omitempty"` + TerminatorId string `protobuf:"bytes,3,opt,name=terminatorId,proto3" json:"terminatorId,omitempty"` + ApiSessionToken string `protobuf:"bytes,4,opt,name=apiSessionToken,proto3" json:"apiSessionToken,omitempty"` } func (x *RemoveTerminatorRequest) Reset() { *x = RemoveTerminatorRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[24] + mi := &file_edge_ctrl_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2071,7 +1917,7 @@ func (x *RemoveTerminatorRequest) String() string { func (*RemoveTerminatorRequest) ProtoMessage() {} func (x *RemoveTerminatorRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[24] + mi := &file_edge_ctrl_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2084,7 +1930,7 @@ func (x *RemoveTerminatorRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveTerminatorRequest.ProtoReflect.Descriptor instead. func (*RemoveTerminatorRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{24} + return file_edge_ctrl_proto_rawDescGZIP(), []int{20} } func (x *RemoveTerminatorRequest) GetSessionToken() string { @@ -2108,6 +1954,13 @@ func (x *RemoveTerminatorRequest) GetTerminatorId() string { return "" } +func (x *RemoveTerminatorRequest) GetApiSessionToken() string { + if x != nil { + return x.ApiSessionToken + } + return "" +} + type UpdateTerminatorRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2120,12 +1973,13 @@ type UpdateTerminatorRequest struct { Precedence TerminatorPrecedence `protobuf:"varint,5,opt,name=precedence,proto3,enum=ziti.edge_ctrl.pb.TerminatorPrecedence" json:"precedence,omitempty"` UpdatePrecedence bool `protobuf:"varint,6,opt,name=updatePrecedence,proto3" json:"updatePrecedence,omitempty"` UpdateCost bool `protobuf:"varint,7,opt,name=updateCost,proto3" json:"updateCost,omitempty"` + ApiSessionToken string `protobuf:"bytes,8,opt,name=apiSessionToken,proto3" json:"apiSessionToken,omitempty"` } func (x *UpdateTerminatorRequest) Reset() { *x = UpdateTerminatorRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[25] + mi := &file_edge_ctrl_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2138,7 +1992,7 @@ func (x *UpdateTerminatorRequest) String() string { func (*UpdateTerminatorRequest) ProtoMessage() {} func (x *UpdateTerminatorRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[25] + mi := &file_edge_ctrl_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2151,7 +2005,7 @@ func (x *UpdateTerminatorRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateTerminatorRequest.ProtoReflect.Descriptor instead. func (*UpdateTerminatorRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{25} + return file_edge_ctrl_proto_rawDescGZIP(), []int{21} } func (x *UpdateTerminatorRequest) GetSessionToken() string { @@ -2203,21 +2057,29 @@ func (x *UpdateTerminatorRequest) GetUpdateCost() bool { return false } +func (x *UpdateTerminatorRequest) GetApiSessionToken() string { + if x != nil { + return x.ApiSessionToken + } + return "" +} + type HealthEventRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - SessionToken string `protobuf:"bytes,1,opt,name=sessionToken,proto3" json:"sessionToken,omitempty"` - Fingerprints []string `protobuf:"bytes,2,rep,name=fingerprints,proto3" json:"fingerprints,omitempty"` - TerminatorId string `protobuf:"bytes,3,opt,name=terminatorId,proto3" json:"terminatorId,omitempty"` - CheckPassed bool `protobuf:"varint,4,opt,name=checkPassed,proto3" json:"checkPassed,omitempty"` + SessionToken string `protobuf:"bytes,1,opt,name=sessionToken,proto3" json:"sessionToken,omitempty"` + Fingerprints []string `protobuf:"bytes,2,rep,name=fingerprints,proto3" json:"fingerprints,omitempty"` + TerminatorId string `protobuf:"bytes,3,opt,name=terminatorId,proto3" json:"terminatorId,omitempty"` + CheckPassed bool `protobuf:"varint,4,opt,name=checkPassed,proto3" json:"checkPassed,omitempty"` + ApiSessionToken string `protobuf:"bytes,5,opt,name=apiSessionToken,proto3" json:"apiSessionToken,omitempty"` } func (x *HealthEventRequest) Reset() { *x = HealthEventRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[26] + mi := &file_edge_ctrl_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2230,7 +2092,7 @@ func (x *HealthEventRequest) String() string { func (*HealthEventRequest) ProtoMessage() {} func (x *HealthEventRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[26] + mi := &file_edge_ctrl_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2243,7 +2105,7 @@ func (x *HealthEventRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HealthEventRequest.ProtoReflect.Descriptor instead. func (*HealthEventRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{26} + return file_edge_ctrl_proto_rawDescGZIP(), []int{22} } func (x *HealthEventRequest) GetSessionToken() string { @@ -2274,6 +2136,13 @@ func (x *HealthEventRequest) GetCheckPassed() bool { return false } +func (x *HealthEventRequest) GetApiSessionToken() string { + if x != nil { + return x.ApiSessionToken + } + return "" +} + type ValidateSessionsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2285,7 +2154,7 @@ type ValidateSessionsRequest struct { func (x *ValidateSessionsRequest) Reset() { *x = ValidateSessionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[27] + mi := &file_edge_ctrl_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2298,7 +2167,7 @@ func (x *ValidateSessionsRequest) String() string { func (*ValidateSessionsRequest) ProtoMessage() {} func (x *ValidateSessionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[27] + mi := &file_edge_ctrl_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2311,7 +2180,7 @@ func (x *ValidateSessionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateSessionsRequest.ProtoReflect.Descriptor instead. func (*ValidateSessionsRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{27} + return file_edge_ctrl_proto_rawDescGZIP(), []int{23} } func (x *ValidateSessionsRequest) GetSessionTokens() []string { @@ -2337,7 +2206,7 @@ type EnvInfo struct { func (x *EnvInfo) Reset() { *x = EnvInfo{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[28] + mi := &file_edge_ctrl_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2350,7 +2219,7 @@ func (x *EnvInfo) String() string { func (*EnvInfo) ProtoMessage() {} func (x *EnvInfo) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[28] + mi := &file_edge_ctrl_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2363,7 +2232,7 @@ func (x *EnvInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use EnvInfo.ProtoReflect.Descriptor instead. func (*EnvInfo) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{28} + return file_edge_ctrl_proto_rawDescGZIP(), []int{24} } func (x *EnvInfo) GetArch() string { @@ -2424,7 +2293,7 @@ type SdkInfo struct { func (x *SdkInfo) Reset() { *x = SdkInfo{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[29] + mi := &file_edge_ctrl_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2437,7 +2306,7 @@ func (x *SdkInfo) String() string { func (*SdkInfo) ProtoMessage() {} func (x *SdkInfo) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[29] + mi := &file_edge_ctrl_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2450,7 +2319,7 @@ func (x *SdkInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use SdkInfo.ProtoReflect.Descriptor instead. func (*SdkInfo) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{29} + return file_edge_ctrl_proto_rawDescGZIP(), []int{25} } func (x *SdkInfo) GetAppId() string { @@ -2508,7 +2377,7 @@ type CreateApiSessionRequest struct { func (x *CreateApiSessionRequest) Reset() { *x = CreateApiSessionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[30] + mi := &file_edge_ctrl_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2521,7 +2390,7 @@ func (x *CreateApiSessionRequest) String() string { func (*CreateApiSessionRequest) ProtoMessage() {} func (x *CreateApiSessionRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[30] + mi := &file_edge_ctrl_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2534,7 +2403,7 @@ func (x *CreateApiSessionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateApiSessionRequest.ProtoReflect.Descriptor instead. func (*CreateApiSessionRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{30} + return file_edge_ctrl_proto_rawDescGZIP(), []int{26} } func (x *CreateApiSessionRequest) GetEnvInfo() *EnvInfo { @@ -2578,7 +2447,7 @@ type CreateApiSessionResponse struct { func (x *CreateApiSessionResponse) Reset() { *x = CreateApiSessionResponse{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[31] + mi := &file_edge_ctrl_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2591,7 +2460,7 @@ func (x *CreateApiSessionResponse) String() string { func (*CreateApiSessionResponse) ProtoMessage() {} func (x *CreateApiSessionResponse) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[31] + mi := &file_edge_ctrl_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2604,7 +2473,7 @@ func (x *CreateApiSessionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateApiSessionResponse.ProtoReflect.Descriptor instead. func (*CreateApiSessionResponse) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{31} + return file_edge_ctrl_proto_rawDescGZIP(), []int{27} } func (x *CreateApiSessionResponse) GetSessionId() string { @@ -2691,7 +2560,7 @@ type CreateCircuitForServiceRequest struct { func (x *CreateCircuitForServiceRequest) Reset() { *x = CreateCircuitForServiceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[32] + mi := &file_edge_ctrl_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2704,7 +2573,7 @@ func (x *CreateCircuitForServiceRequest) String() string { func (*CreateCircuitForServiceRequest) ProtoMessage() {} func (x *CreateCircuitForServiceRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[32] + mi := &file_edge_ctrl_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2717,7 +2586,7 @@ func (x *CreateCircuitForServiceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateCircuitForServiceRequest.ProtoReflect.Descriptor instead. func (*CreateCircuitForServiceRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{32} + return file_edge_ctrl_proto_rawDescGZIP(), []int{28} } func (x *CreateCircuitForServiceRequest) GetSessionId() string { @@ -2760,7 +2629,7 @@ type CreateSessionResponse struct { func (x *CreateSessionResponse) Reset() { *x = CreateSessionResponse{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[33] + mi := &file_edge_ctrl_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2773,7 +2642,7 @@ func (x *CreateSessionResponse) String() string { func (*CreateSessionResponse) ProtoMessage() {} func (x *CreateSessionResponse) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[33] + mi := &file_edge_ctrl_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2786,7 +2655,7 @@ func (x *CreateSessionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateSessionResponse.ProtoReflect.Descriptor instead. func (*CreateSessionResponse) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{33} + return file_edge_ctrl_proto_rawDescGZIP(), []int{29} } func (x *CreateSessionResponse) GetSessionId() string { @@ -2819,7 +2688,7 @@ type CreateCircuitForServiceResponse struct { func (x *CreateCircuitForServiceResponse) Reset() { *x = CreateCircuitForServiceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[34] + mi := &file_edge_ctrl_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2832,7 +2701,7 @@ func (x *CreateCircuitForServiceResponse) String() string { func (*CreateCircuitForServiceResponse) ProtoMessage() {} func (x *CreateCircuitForServiceResponse) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[34] + mi := &file_edge_ctrl_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2845,7 +2714,7 @@ func (x *CreateCircuitForServiceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateCircuitForServiceResponse.ProtoReflect.Descriptor instead. func (*CreateCircuitForServiceResponse) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{34} + return file_edge_ctrl_proto_rawDescGZIP(), []int{30} } func (x *CreateCircuitForServiceResponse) GetApiSession() *CreateApiSessionResponse { @@ -2902,7 +2771,7 @@ type ServicesList struct { func (x *ServicesList) Reset() { *x = ServicesList{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[35] + mi := &file_edge_ctrl_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2915,7 +2784,7 @@ func (x *ServicesList) String() string { func (*ServicesList) ProtoMessage() {} func (x *ServicesList) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[35] + mi := &file_edge_ctrl_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2928,7 +2797,7 @@ func (x *ServicesList) ProtoReflect() protoreflect.Message { // Deprecated: Use ServicesList.ProtoReflect.Descriptor instead. func (*ServicesList) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{35} + return file_edge_ctrl_proto_rawDescGZIP(), []int{31} } func (x *ServicesList) GetLastUpdate() []byte { @@ -2961,7 +2830,7 @@ type TunnelService struct { func (x *TunnelService) Reset() { *x = TunnelService{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[36] + mi := &file_edge_ctrl_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2974,7 +2843,7 @@ func (x *TunnelService) String() string { func (*TunnelService) ProtoMessage() {} func (x *TunnelService) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[36] + mi := &file_edge_ctrl_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2987,7 +2856,7 @@ func (x *TunnelService) ProtoReflect() protoreflect.Message { // Deprecated: Use TunnelService.ProtoReflect.Descriptor instead. func (*TunnelService) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{36} + return file_edge_ctrl_proto_rawDescGZIP(), []int{32} } func (x *TunnelService) GetId() string { @@ -3048,23 +2917,952 @@ type CreateTunnelTerminatorRequest struct { StartTime int64 `protobuf:"varint,9,opt,name=startTime,proto3" json:"startTime,omitempty"` } -func (x *CreateTunnelTerminatorRequest) Reset() { - *x = CreateTunnelTerminatorRequest{} +func (x *CreateTunnelTerminatorRequest) Reset() { + *x = CreateTunnelTerminatorRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateTunnelTerminatorRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateTunnelTerminatorRequest) ProtoMessage() {} + +func (x *CreateTunnelTerminatorRequest) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[33] + 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 CreateTunnelTerminatorRequest.ProtoReflect.Descriptor instead. +func (*CreateTunnelTerminatorRequest) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{33} +} + +func (x *CreateTunnelTerminatorRequest) GetServiceName() string { + if x != nil { + return x.ServiceName + } + return "" +} + +func (x *CreateTunnelTerminatorRequest) GetSessionId() string { + if x != nil { + return x.SessionId + } + return "" +} + +func (x *CreateTunnelTerminatorRequest) GetAddress() string { + if x != nil { + return x.Address + } + return "" +} + +func (x *CreateTunnelTerminatorRequest) GetPeerData() map[uint32][]byte { + if x != nil { + return x.PeerData + } + return nil +} + +func (x *CreateTunnelTerminatorRequest) GetCost() uint32 { + if x != nil { + return x.Cost + } + return 0 +} + +func (x *CreateTunnelTerminatorRequest) GetPrecedence() TerminatorPrecedence { + if x != nil { + return x.Precedence + } + return TerminatorPrecedence_Default +} + +func (x *CreateTunnelTerminatorRequest) GetInstanceId() string { + if x != nil { + return x.InstanceId + } + return "" +} + +func (x *CreateTunnelTerminatorRequest) GetInstanceSecret() []byte { + if x != nil { + return x.InstanceSecret + } + return nil +} + +func (x *CreateTunnelTerminatorRequest) GetStartTime() int64 { + if x != nil { + return x.StartTime + } + return 0 +} + +type CreateTunnelTerminatorResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ApiSession *CreateApiSessionResponse `protobuf:"bytes,1,opt,name=apiSession,proto3" json:"apiSession,omitempty"` + Session *CreateSessionResponse `protobuf:"bytes,2,opt,name=session,proto3" json:"session,omitempty"` + TerminatorId string `protobuf:"bytes,3,opt,name=terminatorId,proto3" json:"terminatorId,omitempty"` + StartTime int64 `protobuf:"varint,4,opt,name=startTime,proto3" json:"startTime,omitempty"` +} + +func (x *CreateTunnelTerminatorResponse) Reset() { + *x = CreateTunnelTerminatorResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateTunnelTerminatorResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateTunnelTerminatorResponse) ProtoMessage() {} + +func (x *CreateTunnelTerminatorResponse) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[34] + 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 CreateTunnelTerminatorResponse.ProtoReflect.Descriptor instead. +func (*CreateTunnelTerminatorResponse) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{34} +} + +func (x *CreateTunnelTerminatorResponse) GetApiSession() *CreateApiSessionResponse { + if x != nil { + return x.ApiSession + } + return nil +} + +func (x *CreateTunnelTerminatorResponse) GetSession() *CreateSessionResponse { + if x != nil { + return x.Session + } + return nil +} + +func (x *CreateTunnelTerminatorResponse) GetTerminatorId() string { + if x != nil { + return x.TerminatorId + } + return "" +} + +func (x *CreateTunnelTerminatorResponse) GetStartTime() int64 { + if x != nil { + return x.StartTime + } + return 0 +} + +type UpdateTunnelTerminatorRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TerminatorId string `protobuf:"bytes,1,opt,name=terminatorId,proto3" json:"terminatorId,omitempty"` + Cost uint32 `protobuf:"varint,2,opt,name=cost,proto3" json:"cost,omitempty"` + Precedence TerminatorPrecedence `protobuf:"varint,3,opt,name=precedence,proto3,enum=ziti.edge_ctrl.pb.TerminatorPrecedence" json:"precedence,omitempty"` + UpdatePrecedence bool `protobuf:"varint,4,opt,name=updatePrecedence,proto3" json:"updatePrecedence,omitempty"` + UpdateCost bool `protobuf:"varint,5,opt,name=updateCost,proto3" json:"updateCost,omitempty"` +} + +func (x *UpdateTunnelTerminatorRequest) Reset() { + *x = UpdateTunnelTerminatorRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateTunnelTerminatorRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateTunnelTerminatorRequest) ProtoMessage() {} + +func (x *UpdateTunnelTerminatorRequest) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[35] + 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 UpdateTunnelTerminatorRequest.ProtoReflect.Descriptor instead. +func (*UpdateTunnelTerminatorRequest) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{35} +} + +func (x *UpdateTunnelTerminatorRequest) GetTerminatorId() string { + if x != nil { + return x.TerminatorId + } + return "" +} + +func (x *UpdateTunnelTerminatorRequest) GetCost() uint32 { + if x != nil { + return x.Cost + } + return 0 +} + +func (x *UpdateTunnelTerminatorRequest) GetPrecedence() TerminatorPrecedence { + if x != nil { + return x.Precedence + } + return TerminatorPrecedence_Default +} + +func (x *UpdateTunnelTerminatorRequest) GetUpdatePrecedence() bool { + if x != nil { + return x.UpdatePrecedence + } + return false +} + +func (x *UpdateTunnelTerminatorRequest) GetUpdateCost() bool { + if x != nil { + return x.UpdateCost + } + return false +} + +type EnrollmentExtendRouterRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClientCertCsr string `protobuf:"bytes,1,opt,name=clientCertCsr,proto3" json:"clientCertCsr,omitempty"` + ServerCertCsr string `protobuf:"bytes,2,opt,name=serverCertCsr,proto3" json:"serverCertCsr,omitempty"` + RequireVerification bool `protobuf:"varint,3,opt,name=requireVerification,proto3" json:"requireVerification,omitempty"` +} + +func (x *EnrollmentExtendRouterRequest) Reset() { + *x = EnrollmentExtendRouterRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnrollmentExtendRouterRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnrollmentExtendRouterRequest) ProtoMessage() {} + +func (x *EnrollmentExtendRouterRequest) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[36] + 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 EnrollmentExtendRouterRequest.ProtoReflect.Descriptor instead. +func (*EnrollmentExtendRouterRequest) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{36} +} + +func (x *EnrollmentExtendRouterRequest) GetClientCertCsr() string { + if x != nil { + return x.ClientCertCsr + } + return "" +} + +func (x *EnrollmentExtendRouterRequest) GetServerCertCsr() string { + if x != nil { + return x.ServerCertCsr + } + return "" +} + +func (x *EnrollmentExtendRouterRequest) GetRequireVerification() bool { + if x != nil { + return x.RequireVerification + } + return false +} + +type EnrollmentCertsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClientCertPem string `protobuf:"bytes,1,opt,name=clientCertPem,proto3" json:"clientCertPem,omitempty"` + ServerCertPem string `protobuf:"bytes,2,opt,name=serverCertPem,proto3" json:"serverCertPem,omitempty"` + CaCertsPem string `protobuf:"bytes,3,opt,name=caCertsPem,proto3" json:"caCertsPem,omitempty"` +} + +func (x *EnrollmentCertsResponse) Reset() { + *x = EnrollmentCertsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnrollmentCertsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnrollmentCertsResponse) ProtoMessage() {} + +func (x *EnrollmentCertsResponse) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[37] + 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 EnrollmentCertsResponse.ProtoReflect.Descriptor instead. +func (*EnrollmentCertsResponse) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{37} +} + +func (x *EnrollmentCertsResponse) GetClientCertPem() string { + if x != nil { + return x.ClientCertPem + } + return "" +} + +func (x *EnrollmentCertsResponse) GetServerCertPem() string { + if x != nil { + return x.ServerCertPem + } + return "" +} + +func (x *EnrollmentCertsResponse) GetCaCertsPem() string { + if x != nil { + return x.CaCertsPem + } + return "" +} + +type EnrollmentExtendRouterVerifyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClientCertPem string `protobuf:"bytes,1,opt,name=clientCertPem,proto3" json:"clientCertPem,omitempty"` +} + +func (x *EnrollmentExtendRouterVerifyRequest) Reset() { + *x = EnrollmentExtendRouterVerifyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnrollmentExtendRouterVerifyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnrollmentExtendRouterVerifyRequest) ProtoMessage() {} + +func (x *EnrollmentExtendRouterVerifyRequest) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[38] + 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 EnrollmentExtendRouterVerifyRequest.ProtoReflect.Descriptor instead. +func (*EnrollmentExtendRouterVerifyRequest) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{38} +} + +func (x *EnrollmentExtendRouterVerifyRequest) GetClientCertPem() string { + if x != nil { + return x.ClientCertPem + } + return "" +} + +type DataState_Identity struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + ServicePolicyIds []string `protobuf:"bytes,3,rep,name=servicePolicyIds,proto3" json:"servicePolicyIds,omitempty"` +} + +func (x *DataState_Identity) Reset() { + *x = DataState_Identity{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DataState_Identity) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataState_Identity) ProtoMessage() {} + +func (x *DataState_Identity) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[42] + 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 DataState_Identity.ProtoReflect.Descriptor instead. +func (*DataState_Identity) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 0} +} + +func (x *DataState_Identity) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *DataState_Identity) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DataState_Identity) GetServicePolicyIds() []string { + if x != nil { + return x.ServicePolicyIds + } + return nil +} + +type DataState_Service struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + EncryptionRequired bool `protobuf:"varint,3,opt,name=encryptionRequired,proto3" json:"encryptionRequired,omitempty"` +} + +func (x *DataState_Service) Reset() { + *x = DataState_Service{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DataState_Service) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataState_Service) ProtoMessage() {} + +func (x *DataState_Service) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[43] + 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 DataState_Service.ProtoReflect.Descriptor instead. +func (*DataState_Service) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 1} +} + +func (x *DataState_Service) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *DataState_Service) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DataState_Service) GetEncryptionRequired() bool { + if x != nil { + return x.EncryptionRequired + } + return false +} + +type DataState_ServicePolicy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + ServiceIds []string `protobuf:"bytes,3,rep,name=serviceIds,proto3" json:"serviceIds,omitempty"` + PostureCheckIds []string `protobuf:"bytes,4,rep,name=postureCheckIds,proto3" json:"postureCheckIds,omitempty"` + IdentityIds []string `protobuf:"bytes,5,rep,name=identityIds,proto3" json:"identityIds,omitempty"` +} + +func (x *DataState_ServicePolicy) Reset() { + *x = DataState_ServicePolicy{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DataState_ServicePolicy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataState_ServicePolicy) ProtoMessage() {} + +func (x *DataState_ServicePolicy) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[44] + 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 DataState_ServicePolicy.ProtoReflect.Descriptor instead. +func (*DataState_ServicePolicy) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 2} +} + +func (x *DataState_ServicePolicy) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *DataState_ServicePolicy) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DataState_ServicePolicy) GetServiceIds() []string { + if x != nil { + return x.ServiceIds + } + return nil +} + +func (x *DataState_ServicePolicy) GetPostureCheckIds() []string { + if x != nil { + return x.PostureCheckIds + } + return nil +} + +func (x *DataState_ServicePolicy) GetIdentityIds() []string { + if x != nil { + return x.IdentityIds + } + return nil +} + +type DataState_Revocation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=ExpiresAt,proto3" json:"ExpiresAt,omitempty"` +} + +func (x *DataState_Revocation) Reset() { + *x = DataState_Revocation{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DataState_Revocation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataState_Revocation) ProtoMessage() {} + +func (x *DataState_Revocation) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[45] + 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 DataState_Revocation.ProtoReflect.Descriptor instead. +func (*DataState_Revocation) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 3} +} + +func (x *DataState_Revocation) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *DataState_Revocation) GetExpiresAt() *timestamppb.Timestamp { + if x != nil { + return x.ExpiresAt + } + return nil +} + +type DataState_Event struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Action DataState_Action `protobuf:"varint,1,opt,name=action,proto3,enum=ziti.edge_ctrl.pb.DataState_Action" json:"action,omitempty"` + Index uint64 `protobuf:"varint,2,opt,name=index,proto3" json:"index,omitempty"` + IsSynthetic bool `protobuf:"varint,3,opt,name=isSynthetic,proto3" json:"isSynthetic,omitempty"` + // Types that are assignable to Model: + // + // *DataState_Event_Identity + // *DataState_Event_Service + // *DataState_Event_ServicePolicy + // *DataState_Event_PostureCheck + // *DataState_Event_PublicKey + // *DataState_Event_Revocation + Model isDataState_Event_Model `protobuf_oneof:"Model"` +} + +func (x *DataState_Event) Reset() { + *x = DataState_Event{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DataState_Event) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataState_Event) ProtoMessage() {} + +func (x *DataState_Event) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[46] + 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 DataState_Event.ProtoReflect.Descriptor instead. +func (*DataState_Event) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 4} +} + +func (x *DataState_Event) GetAction() DataState_Action { + if x != nil { + return x.Action + } + return DataState_Create +} + +func (x *DataState_Event) GetIndex() uint64 { + if x != nil { + return x.Index + } + return 0 +} + +func (x *DataState_Event) GetIsSynthetic() bool { + if x != nil { + return x.IsSynthetic + } + return false +} + +func (m *DataState_Event) GetModel() isDataState_Event_Model { + if m != nil { + return m.Model + } + return nil +} + +func (x *DataState_Event) GetIdentity() *DataState_Identity { + if x, ok := x.GetModel().(*DataState_Event_Identity); ok { + return x.Identity + } + return nil +} + +func (x *DataState_Event) GetService() *DataState_Service { + if x, ok := x.GetModel().(*DataState_Event_Service); ok { + return x.Service + } + return nil +} + +func (x *DataState_Event) GetServicePolicy() *DataState_ServicePolicy { + if x, ok := x.GetModel().(*DataState_Event_ServicePolicy); ok { + return x.ServicePolicy + } + return nil +} + +func (x *DataState_Event) GetPostureCheck() *DataState_PostureCheck { + if x, ok := x.GetModel().(*DataState_Event_PostureCheck); ok { + return x.PostureCheck + } + return nil +} + +func (x *DataState_Event) GetPublicKey() *DataState_PublicKey { + if x, ok := x.GetModel().(*DataState_Event_PublicKey); ok { + return x.PublicKey + } + return nil +} + +func (x *DataState_Event) GetRevocation() *DataState_Revocation { + if x, ok := x.GetModel().(*DataState_Event_Revocation); ok { + return x.Revocation + } + return nil +} + +type isDataState_Event_Model interface { + isDataState_Event_Model() +} + +type DataState_Event_Identity struct { + Identity *DataState_Identity `protobuf:"bytes,10,opt,name=identity,proto3,oneof"` +} + +type DataState_Event_Service struct { + Service *DataState_Service `protobuf:"bytes,11,opt,name=service,proto3,oneof"` +} + +type DataState_Event_ServicePolicy struct { + ServicePolicy *DataState_ServicePolicy `protobuf:"bytes,12,opt,name=servicePolicy,proto3,oneof"` +} + +type DataState_Event_PostureCheck struct { + PostureCheck *DataState_PostureCheck `protobuf:"bytes,13,opt,name=postureCheck,proto3,oneof"` +} + +type DataState_Event_PublicKey struct { + PublicKey *DataState_PublicKey `protobuf:"bytes,14,opt,name=publicKey,proto3,oneof"` +} + +type DataState_Event_Revocation struct { + Revocation *DataState_Revocation `protobuf:"bytes,15,opt,name=revocation,proto3,oneof"` +} + +func (*DataState_Event_Identity) isDataState_Event_Model() {} + +func (*DataState_Event_Service) isDataState_Event_Model() {} + +func (*DataState_Event_ServicePolicy) isDataState_Event_Model() {} + +func (*DataState_Event_PostureCheck) isDataState_Event_Model() {} + +func (*DataState_Event_PublicKey) isDataState_Event_Model() {} + +func (*DataState_Event_Revocation) isDataState_Event_Model() {} + +type DataState_PublicKey struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` //public key + Kid string `protobuf:"bytes,2,opt,name=kid,proto3" json:"kid,omitempty"` //key id/fingerprint + Usages []DataState_PublicKey_Usage `protobuf:"varint,3,rep,packed,name=usages,proto3,enum=ziti.edge_ctrl.pb.DataState_PublicKey_Usage" json:"usages,omitempty"` // what the public key in data is used for + Format DataState_PublicKey_Format `protobuf:"varint,4,opt,name=format,proto3,enum=ziti.edge_ctrl.pb.DataState_PublicKey_Format" json:"format,omitempty"` //the format of the public key in data and chain +} + +func (x *DataState_PublicKey) Reset() { + *x = DataState_PublicKey{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DataState_PublicKey) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataState_PublicKey) ProtoMessage() {} + +func (x *DataState_PublicKey) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[47] + 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 DataState_PublicKey.ProtoReflect.Descriptor instead. +func (*DataState_PublicKey) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 5} +} + +func (x *DataState_PublicKey) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *DataState_PublicKey) GetKid() string { + if x != nil { + return x.Kid + } + return "" +} + +func (x *DataState_PublicKey) GetUsages() []DataState_PublicKey_Usage { + if x != nil { + return x.Usages + } + return nil +} + +func (x *DataState_PublicKey) GetFormat() DataState_PublicKey_Format { + if x != nil { + return x.Format + } + return DataState_PublicKey_X509CertDer +} + +type DataState_PostureCheck struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + TypeId string `protobuf:"bytes,4,opt,name=typeId,proto3" json:"typeId,omitempty"` + // Types that are assignable to Subtype: + // + // *DataState_PostureCheck_Mac_ + // *DataState_PostureCheck_Mfa_ + // *DataState_PostureCheck_OsList_ + // *DataState_PostureCheck_Process_ + // *DataState_PostureCheck_ProcessMulti_ + // *DataState_PostureCheck_Domains_ + Subtype isDataState_PostureCheck_Subtype `protobuf_oneof:"subtype"` +} + +func (x *DataState_PostureCheck) Reset() { + *x = DataState_PostureCheck{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[37] + mi := &file_edge_ctrl_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateTunnelTerminatorRequest) String() string { +func (x *DataState_PostureCheck) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateTunnelTerminatorRequest) ProtoMessage() {} +func (*DataState_PostureCheck) ProtoMessage() {} -func (x *CreateTunnelTerminatorRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[37] +func (x *DataState_PostureCheck) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3075,102 +3873,146 @@ func (x *CreateTunnelTerminatorRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateTunnelTerminatorRequest.ProtoReflect.Descriptor instead. -func (*CreateTunnelTerminatorRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{37} +// Deprecated: Use DataState_PostureCheck.ProtoReflect.Descriptor instead. +func (*DataState_PostureCheck) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 6} } -func (x *CreateTunnelTerminatorRequest) GetServiceName() string { +func (x *DataState_PostureCheck) GetId() string { if x != nil { - return x.ServiceName + return x.Id } return "" } -func (x *CreateTunnelTerminatorRequest) GetSessionId() string { +func (x *DataState_PostureCheck) GetName() string { if x != nil { - return x.SessionId + return x.Name } return "" } -func (x *CreateTunnelTerminatorRequest) GetAddress() string { +func (x *DataState_PostureCheck) GetTypeId() string { if x != nil { - return x.Address + return x.TypeId } return "" } -func (x *CreateTunnelTerminatorRequest) GetPeerData() map[uint32][]byte { - if x != nil { - return x.PeerData +func (m *DataState_PostureCheck) GetSubtype() isDataState_PostureCheck_Subtype { + if m != nil { + return m.Subtype } return nil } -func (x *CreateTunnelTerminatorRequest) GetCost() uint32 { - if x != nil { - return x.Cost +func (x *DataState_PostureCheck) GetMac() *DataState_PostureCheck_Mac { + if x, ok := x.GetSubtype().(*DataState_PostureCheck_Mac_); ok { + return x.Mac } - return 0 + return nil } -func (x *CreateTunnelTerminatorRequest) GetPrecedence() TerminatorPrecedence { - if x != nil { - return x.Precedence +func (x *DataState_PostureCheck) GetMfa() *DataState_PostureCheck_Mfa { + if x, ok := x.GetSubtype().(*DataState_PostureCheck_Mfa_); ok { + return x.Mfa } - return TerminatorPrecedence_Default + return nil } -func (x *CreateTunnelTerminatorRequest) GetInstanceId() string { - if x != nil { - return x.InstanceId +func (x *DataState_PostureCheck) GetOsList() *DataState_PostureCheck_OsList { + if x, ok := x.GetSubtype().(*DataState_PostureCheck_OsList_); ok { + return x.OsList } - return "" + return nil } -func (x *CreateTunnelTerminatorRequest) GetInstanceSecret() []byte { - if x != nil { - return x.InstanceSecret +func (x *DataState_PostureCheck) GetProcess() *DataState_PostureCheck_Process { + if x, ok := x.GetSubtype().(*DataState_PostureCheck_Process_); ok { + return x.Process } return nil } -func (x *CreateTunnelTerminatorRequest) GetStartTime() int64 { - if x != nil { - return x.StartTime +func (x *DataState_PostureCheck) GetProcessMulti() *DataState_PostureCheck_ProcessMulti { + if x, ok := x.GetSubtype().(*DataState_PostureCheck_ProcessMulti_); ok { + return x.ProcessMulti } - return 0 + return nil } -type CreateTunnelTerminatorResponse struct { +func (x *DataState_PostureCheck) GetDomains() *DataState_PostureCheck_Domains { + if x, ok := x.GetSubtype().(*DataState_PostureCheck_Domains_); ok { + return x.Domains + } + return nil +} + +type isDataState_PostureCheck_Subtype interface { + isDataState_PostureCheck_Subtype() +} + +type DataState_PostureCheck_Mac_ struct { + Mac *DataState_PostureCheck_Mac `protobuf:"bytes,7,opt,name=mac,proto3,oneof"` +} + +type DataState_PostureCheck_Mfa_ struct { + Mfa *DataState_PostureCheck_Mfa `protobuf:"bytes,8,opt,name=mfa,proto3,oneof"` +} + +type DataState_PostureCheck_OsList_ struct { + OsList *DataState_PostureCheck_OsList `protobuf:"bytes,9,opt,name=osList,proto3,oneof"` +} + +type DataState_PostureCheck_Process_ struct { + Process *DataState_PostureCheck_Process `protobuf:"bytes,10,opt,name=process,proto3,oneof"` +} + +type DataState_PostureCheck_ProcessMulti_ struct { + ProcessMulti *DataState_PostureCheck_ProcessMulti `protobuf:"bytes,11,opt,name=processMulti,proto3,oneof"` +} + +type DataState_PostureCheck_Domains_ struct { + Domains *DataState_PostureCheck_Domains `protobuf:"bytes,12,opt,name=domains,proto3,oneof"` +} + +func (*DataState_PostureCheck_Mac_) isDataState_PostureCheck_Subtype() {} + +func (*DataState_PostureCheck_Mfa_) isDataState_PostureCheck_Subtype() {} + +func (*DataState_PostureCheck_OsList_) isDataState_PostureCheck_Subtype() {} + +func (*DataState_PostureCheck_Process_) isDataState_PostureCheck_Subtype() {} + +func (*DataState_PostureCheck_ProcessMulti_) isDataState_PostureCheck_Subtype() {} + +func (*DataState_PostureCheck_Domains_) isDataState_PostureCheck_Subtype() {} + +type DataState_PostureCheck_Mac struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ApiSession *CreateApiSessionResponse `protobuf:"bytes,1,opt,name=apiSession,proto3" json:"apiSession,omitempty"` - Session *CreateSessionResponse `protobuf:"bytes,2,opt,name=session,proto3" json:"session,omitempty"` - TerminatorId string `protobuf:"bytes,3,opt,name=terminatorId,proto3" json:"terminatorId,omitempty"` - StartTime int64 `protobuf:"varint,4,opt,name=startTime,proto3" json:"startTime,omitempty"` + MacAddresses []string `protobuf:"bytes,1,rep,name=macAddresses,proto3" json:"macAddresses,omitempty"` } -func (x *CreateTunnelTerminatorResponse) Reset() { - *x = CreateTunnelTerminatorResponse{} +func (x *DataState_PostureCheck_Mac) Reset() { + *x = DataState_PostureCheck_Mac{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[38] + mi := &file_edge_ctrl_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateTunnelTerminatorResponse) String() string { +func (x *DataState_PostureCheck_Mac) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateTunnelTerminatorResponse) ProtoMessage() {} +func (*DataState_PostureCheck_Mac) ProtoMessage() {} -func (x *CreateTunnelTerminatorResponse) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[38] +func (x *DataState_PostureCheck_Mac) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3181,68 +4023,115 @@ func (x *CreateTunnelTerminatorResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateTunnelTerminatorResponse.ProtoReflect.Descriptor instead. -func (*CreateTunnelTerminatorResponse) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{38} +// Deprecated: Use DataState_PostureCheck_Mac.ProtoReflect.Descriptor instead. +func (*DataState_PostureCheck_Mac) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 6, 0} } -func (x *CreateTunnelTerminatorResponse) GetApiSession() *CreateApiSessionResponse { +func (x *DataState_PostureCheck_Mac) GetMacAddresses() []string { if x != nil { - return x.ApiSession + return x.MacAddresses } return nil } -func (x *CreateTunnelTerminatorResponse) GetSession() *CreateSessionResponse { +type DataState_PostureCheck_Mfa struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TimeoutSeconds int64 `protobuf:"varint,1,opt,name=TimeoutSeconds,proto3" json:"TimeoutSeconds,omitempty"` + PromptOnWake bool `protobuf:"varint,2,opt,name=PromptOnWake,proto3" json:"PromptOnWake,omitempty"` + PromptOnUnlock bool `protobuf:"varint,3,opt,name=PromptOnUnlock,proto3" json:"PromptOnUnlock,omitempty"` + IgnoreLegacyEndpoints bool `protobuf:"varint,4,opt,name=IgnoreLegacyEndpoints,proto3" json:"IgnoreLegacyEndpoints,omitempty"` +} + +func (x *DataState_PostureCheck_Mfa) Reset() { + *x = DataState_PostureCheck_Mfa{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DataState_PostureCheck_Mfa) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataState_PostureCheck_Mfa) ProtoMessage() {} + +func (x *DataState_PostureCheck_Mfa) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[50] + 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 DataState_PostureCheck_Mfa.ProtoReflect.Descriptor instead. +func (*DataState_PostureCheck_Mfa) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 6, 1} +} + +func (x *DataState_PostureCheck_Mfa) GetTimeoutSeconds() int64 { if x != nil { - return x.Session + return x.TimeoutSeconds } - return nil + return 0 } -func (x *CreateTunnelTerminatorResponse) GetTerminatorId() string { +func (x *DataState_PostureCheck_Mfa) GetPromptOnWake() bool { if x != nil { - return x.TerminatorId + return x.PromptOnWake } - return "" + return false } -func (x *CreateTunnelTerminatorResponse) GetStartTime() int64 { +func (x *DataState_PostureCheck_Mfa) GetPromptOnUnlock() bool { if x != nil { - return x.StartTime + return x.PromptOnUnlock } - return 0 + return false } -type UpdateTunnelTerminatorRequest struct { +func (x *DataState_PostureCheck_Mfa) GetIgnoreLegacyEndpoints() bool { + if x != nil { + return x.IgnoreLegacyEndpoints + } + return false +} + +type DataState_PostureCheck_Os struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TerminatorId string `protobuf:"bytes,1,opt,name=terminatorId,proto3" json:"terminatorId,omitempty"` - Cost uint32 `protobuf:"varint,2,opt,name=cost,proto3" json:"cost,omitempty"` - Precedence TerminatorPrecedence `protobuf:"varint,3,opt,name=precedence,proto3,enum=ziti.edge_ctrl.pb.TerminatorPrecedence" json:"precedence,omitempty"` - UpdatePrecedence bool `protobuf:"varint,4,opt,name=updatePrecedence,proto3" json:"updatePrecedence,omitempty"` - UpdateCost bool `protobuf:"varint,5,opt,name=updateCost,proto3" json:"updateCost,omitempty"` + OsType string `protobuf:"bytes,1,opt,name=OsType,proto3" json:"OsType,omitempty"` + OsVersions []string `protobuf:"bytes,2,rep,name=OsVersions,proto3" json:"OsVersions,omitempty"` } -func (x *UpdateTunnelTerminatorRequest) Reset() { - *x = UpdateTunnelTerminatorRequest{} +func (x *DataState_PostureCheck_Os) Reset() { + *x = DataState_PostureCheck_Os{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[39] + mi := &file_edge_ctrl_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateTunnelTerminatorRequest) String() string { +func (x *DataState_PostureCheck_Os) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateTunnelTerminatorRequest) ProtoMessage() {} +func (*DataState_PostureCheck_Os) ProtoMessage() {} -func (x *UpdateTunnelTerminatorRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[39] +func (x *DataState_PostureCheck_Os) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3253,73 +4142,100 @@ func (x *UpdateTunnelTerminatorRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateTunnelTerminatorRequest.ProtoReflect.Descriptor instead. -func (*UpdateTunnelTerminatorRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{39} +// Deprecated: Use DataState_PostureCheck_Os.ProtoReflect.Descriptor instead. +func (*DataState_PostureCheck_Os) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 6, 2} } -func (x *UpdateTunnelTerminatorRequest) GetTerminatorId() string { +func (x *DataState_PostureCheck_Os) GetOsType() string { if x != nil { - return x.TerminatorId + return x.OsType } return "" } -func (x *UpdateTunnelTerminatorRequest) GetCost() uint32 { +func (x *DataState_PostureCheck_Os) GetOsVersions() []string { if x != nil { - return x.Cost + return x.OsVersions } - return 0 + return nil } -func (x *UpdateTunnelTerminatorRequest) GetPrecedence() TerminatorPrecedence { - if x != nil { - return x.Precedence +type DataState_PostureCheck_OsList struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + OsList []*DataState_PostureCheck_Os `protobuf:"bytes,1,rep,name=osList,proto3" json:"osList,omitempty"` +} + +func (x *DataState_PostureCheck_OsList) Reset() { + *x = DataState_PostureCheck_OsList{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return TerminatorPrecedence_Default } -func (x *UpdateTunnelTerminatorRequest) GetUpdatePrecedence() bool { - if x != nil { - return x.UpdatePrecedence +func (x *DataState_PostureCheck_OsList) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataState_PostureCheck_OsList) ProtoMessage() {} + +func (x *DataState_PostureCheck_OsList) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[52] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return false + return mi.MessageOf(x) } -func (x *UpdateTunnelTerminatorRequest) GetUpdateCost() bool { +// Deprecated: Use DataState_PostureCheck_OsList.ProtoReflect.Descriptor instead. +func (*DataState_PostureCheck_OsList) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 6, 3} +} + +func (x *DataState_PostureCheck_OsList) GetOsList() []*DataState_PostureCheck_Os { if x != nil { - return x.UpdateCost + return x.OsList } - return false + return nil } -type EnrollmentExtendRouterRequest struct { +type DataState_PostureCheck_Process struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClientCertCsr string `protobuf:"bytes,1,opt,name=clientCertCsr,proto3" json:"clientCertCsr,omitempty"` - ServerCertCsr string `protobuf:"bytes,2,opt,name=serverCertCsr,proto3" json:"serverCertCsr,omitempty"` - RequireVerification bool `protobuf:"varint,3,opt,name=requireVerification,proto3" json:"requireVerification,omitempty"` + OsType string `protobuf:"bytes,1,opt,name=OsType,proto3" json:"OsType,omitempty"` + Path string `protobuf:"bytes,2,opt,name=Path,proto3" json:"Path,omitempty"` + Hashes []string `protobuf:"bytes,3,rep,name=Hashes,proto3" json:"Hashes,omitempty"` + Fingerprints []string `protobuf:"bytes,4,rep,name=Fingerprints,proto3" json:"Fingerprints,omitempty"` } -func (x *EnrollmentExtendRouterRequest) Reset() { - *x = EnrollmentExtendRouterRequest{} +func (x *DataState_PostureCheck_Process) Reset() { + *x = DataState_PostureCheck_Process{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[40] + mi := &file_edge_ctrl_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *EnrollmentExtendRouterRequest) String() string { +func (x *DataState_PostureCheck_Process) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EnrollmentExtendRouterRequest) ProtoMessage() {} +func (*DataState_PostureCheck_Process) ProtoMessage() {} -func (x *EnrollmentExtendRouterRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[40] +func (x *DataState_PostureCheck_Process) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3330,59 +4246,65 @@ func (x *EnrollmentExtendRouterRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use EnrollmentExtendRouterRequest.ProtoReflect.Descriptor instead. -func (*EnrollmentExtendRouterRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{40} +// Deprecated: Use DataState_PostureCheck_Process.ProtoReflect.Descriptor instead. +func (*DataState_PostureCheck_Process) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 6, 4} } -func (x *EnrollmentExtendRouterRequest) GetClientCertCsr() string { +func (x *DataState_PostureCheck_Process) GetOsType() string { if x != nil { - return x.ClientCertCsr + return x.OsType } return "" } -func (x *EnrollmentExtendRouterRequest) GetServerCertCsr() string { +func (x *DataState_PostureCheck_Process) GetPath() string { if x != nil { - return x.ServerCertCsr + return x.Path } return "" } -func (x *EnrollmentExtendRouterRequest) GetRequireVerification() bool { +func (x *DataState_PostureCheck_Process) GetHashes() []string { if x != nil { - return x.RequireVerification + return x.Hashes } - return false + return nil } -type EnrollmentCertsResponse struct { +func (x *DataState_PostureCheck_Process) GetFingerprints() []string { + if x != nil { + return x.Fingerprints + } + return nil +} + +type DataState_PostureCheck_ProcessMulti struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClientCertPem string `protobuf:"bytes,1,opt,name=clientCertPem,proto3" json:"clientCertPem,omitempty"` - ServerCertPem string `protobuf:"bytes,2,opt,name=serverCertPem,proto3" json:"serverCertPem,omitempty"` - CaCertsPem string `protobuf:"bytes,3,opt,name=caCertsPem,proto3" json:"caCertsPem,omitempty"` + Semantic string `protobuf:"bytes,1,opt,name=semantic,proto3" json:"semantic,omitempty"` + Processes []*DataState_PostureCheck_Process `protobuf:"bytes,2,rep,name=processes,proto3" json:"processes,omitempty"` } -func (x *EnrollmentCertsResponse) Reset() { - *x = EnrollmentCertsResponse{} +func (x *DataState_PostureCheck_ProcessMulti) Reset() { + *x = DataState_PostureCheck_ProcessMulti{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[41] + mi := &file_edge_ctrl_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *EnrollmentCertsResponse) String() string { +func (x *DataState_PostureCheck_ProcessMulti) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EnrollmentCertsResponse) ProtoMessage() {} +func (*DataState_PostureCheck_ProcessMulti) ProtoMessage() {} -func (x *EnrollmentCertsResponse) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[41] +func (x *DataState_PostureCheck_ProcessMulti) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3393,57 +4315,50 @@ func (x *EnrollmentCertsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use EnrollmentCertsResponse.ProtoReflect.Descriptor instead. -func (*EnrollmentCertsResponse) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{41} -} - -func (x *EnrollmentCertsResponse) GetClientCertPem() string { - if x != nil { - return x.ClientCertPem - } - return "" +// Deprecated: Use DataState_PostureCheck_ProcessMulti.ProtoReflect.Descriptor instead. +func (*DataState_PostureCheck_ProcessMulti) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 6, 5} } -func (x *EnrollmentCertsResponse) GetServerCertPem() string { +func (x *DataState_PostureCheck_ProcessMulti) GetSemantic() string { if x != nil { - return x.ServerCertPem + return x.Semantic } return "" } -func (x *EnrollmentCertsResponse) GetCaCertsPem() string { +func (x *DataState_PostureCheck_ProcessMulti) GetProcesses() []*DataState_PostureCheck_Process { if x != nil { - return x.CaCertsPem + return x.Processes } - return "" + return nil } -type EnrollmentExtendRouterVerifyRequest struct { +type DataState_PostureCheck_Domains struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClientCertPem string `protobuf:"bytes,1,opt,name=clientCertPem,proto3" json:"clientCertPem,omitempty"` + Domains []string `protobuf:"bytes,1,rep,name=domains,proto3" json:"domains,omitempty"` } -func (x *EnrollmentExtendRouterVerifyRequest) Reset() { - *x = EnrollmentExtendRouterVerifyRequest{} +func (x *DataState_PostureCheck_Domains) Reset() { + *x = DataState_PostureCheck_Domains{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[42] + mi := &file_edge_ctrl_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *EnrollmentExtendRouterVerifyRequest) String() string { +func (x *DataState_PostureCheck_Domains) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EnrollmentExtendRouterVerifyRequest) ProtoMessage() {} +func (*DataState_PostureCheck_Domains) ProtoMessage() {} -func (x *EnrollmentExtendRouterVerifyRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[42] +func (x *DataState_PostureCheck_Domains) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3454,675 +4369,814 @@ func (x *EnrollmentExtendRouterVerifyRequest) ProtoReflect() protoreflect.Messag return mi.MessageOf(x) } -// Deprecated: Use EnrollmentExtendRouterVerifyRequest.ProtoReflect.Descriptor instead. -func (*EnrollmentExtendRouterVerifyRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{42} +// Deprecated: Use DataState_PostureCheck_Domains.ProtoReflect.Descriptor instead. +func (*DataState_PostureCheck_Domains) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 6, 6} } -func (x *EnrollmentExtendRouterVerifyRequest) GetClientCertPem() string { +func (x *DataState_PostureCheck_Domains) GetDomains() []string { if x != nil { - return x.ClientCertPem + return x.Domains } - return "" + return nil } var File_edge_ctrl_proto protoreflect.FileDescriptor var file_edge_ctrl_proto_rawDesc = []byte{ - 0x0a, 0x0f, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x12, 0x11, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, - 0x6c, 0x2e, 0x70, 0x62, 0x22, 0xa5, 0x02, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, - 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3c, - 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x7a, - 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x48, 0x0a, 0x08, - 0x62, 0x79, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, - 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, - 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, 0x42, - 0x79, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x62, 0x79, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x3b, 0x0a, 0x0d, 0x42, 0x79, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x07, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, - 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, - 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x28, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x7a, 0x0a, 0x08, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, - 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x61, - 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, - 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x09, 0x61, 0x64, 0x76, 0x65, - 0x72, 0x74, 0x69, 0x73, 0x65, 0x22, 0xb9, 0x02, 0x0a, 0x0b, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x0a, 0x0f, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x11, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, + 0x6c, 0x2e, 0x70, 0x62, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa5, 0x02, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x12, 0x3c, 0x0a, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, - 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x39, 0x0a, - 0x09, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, - 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x6c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x4b, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, 0x5d, - 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, - 0x12, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x6e, 0x63, 0x72, 0x79, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0xfe, 0x02, - 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, - 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x49, 0x64, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x31, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, - 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, - 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x4b, 0x65, 0x79, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x4b, - 0x65, 0x79, 0x73, 0x12, 0x3b, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, - 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, - 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, - 0x12, 0x36, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, - 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x0a, 0x70, 0x6f, 0x73, 0x74, - 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x7a, + 0x3c, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, + 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x48, 0x0a, + 0x08, 0x62, 0x79, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2c, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, + 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, + 0x42, 0x79, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x62, + 0x79, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x3b, 0x0a, 0x0d, 0x42, 0x79, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, + 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, + 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, + 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x28, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x7a, 0x0a, 0x08, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, + 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x38, 0x0a, 0x09, + 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, + 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x09, 0x61, 0x64, 0x76, + 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x22, 0xb9, 0x02, 0x0a, 0x0b, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x12, 0x3c, 0x0a, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, + 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x39, + 0x0a, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, + 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x09, + 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x44, 0x61, 0x74, + 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x4b, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x63, + 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, + 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, + 0x5d, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2e, + 0x0a, 0x12, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x6e, 0x63, 0x72, + 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0xdc, + 0x14, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3a, 0x0a, 0x06, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, - 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x0a, 0x70, 0x6f, 0x73, - 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x12, 0x45, 0x0a, 0x0d, 0x70, 0x6f, 0x73, 0x74, 0x75, - 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, - 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, - 0x0d, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x22, 0x21, - 0x0a, 0x0b, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x73, 0x12, 0x12, 0x0a, - 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, 0x6b, 0x65, 0x79, - 0x73, 0x22, 0x4e, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, - 0x73, 0x22, 0x5a, 0x0a, 0x0a, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x12, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x1a, 0x5a, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x73, + 0x1a, 0x5d, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x2e, 0x0a, 0x12, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x6e, 0x63, + 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x1a, + 0x9f, 0x01, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x64, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, + 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x64, 0x73, 0x12, + 0x20, 0x0a, 0x0b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, + 0x73, 0x1a, 0x56, 0x0a, 0x0a, 0x52, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x6f, - 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x64, 0x73, 0x22, 0xaa, 0x01, - 0x0a, 0x0c, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x3d, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x29, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, - 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfd, 0x01, 0x0a, 0x07, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x32, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x7a, 0x69, 0x74, - 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x65, 0x72, 0x74, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, - 0x69, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x63, 0x65, 0x72, 0x74, - 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, - 0x75, 0x72, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x75, 0x72, 0x6c, 0x73, - 0x12, 0x34, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, - 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x70, - 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x5e, 0x0a, 0x0a, 0x41, 0x70, - 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2a, - 0x0a, 0x10, 0x63, 0x65, 0x72, 0x74, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x63, 0x65, 0x72, 0x74, 0x46, 0x69, - 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x74, 0x0a, 0x0f, 0x41, 0x70, - 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x65, 0x64, 0x12, 0x20, 0x0a, - 0x0b, 0x69, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x3f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, - 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0x54, 0x0a, 0x11, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x7a, 0x69, 0x74, - 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x41, - 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x61, 0x70, 0x69, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3d, 0x0a, 0x11, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x2d, 0x0a, 0x13, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x73, 0x22, 0x3a, 0x0a, 0x0e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x10, - 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, - 0x22, 0x2d, 0x0a, 0x13, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, - 0xa2, 0x02, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, - 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, - 0x12, 0x32, 0x0a, 0x14, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, - 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, - 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x38, 0x0a, 0x09, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x1a, 0xc4, 0x04, 0x0a, 0x05, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, + 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x73, 0x53, 0x79, 0x6e, 0x74, + 0x68, 0x65, 0x74, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x53, + 0x79, 0x6e, 0x74, 0x68, 0x65, 0x74, 0x69, 0x63, 0x12, 0x43, 0x0a, 0x08, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x69, 0x74, + 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x48, 0x00, 0x52, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x40, 0x0a, + 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, + 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, + 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x52, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, + 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x48, 0x00, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x4f, 0x0a, 0x0c, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x69, 0x74, 0x69, + 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x48, 0x00, 0x52, 0x0c, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x12, 0x46, 0x0a, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, + 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, + 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x48, + 0x00, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x49, 0x0a, 0x0a, + 0x72, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, + 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, + 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x72, 0x65, 0x76, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x07, 0x0a, 0x05, 0x4d, 0x6f, 0x64, 0x65, 0x6c, + 0x1a, 0xa6, 0x02, 0x0a, 0x09, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x12, + 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x69, 0x64, 0x12, 0x44, 0x0a, 0x06, 0x75, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, + 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x2e, 0x55, 0x73, 0x61, + 0x67, 0x65, 0x52, 0x06, 0x75, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x7a, 0x69, 0x74, + 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, + 0x65, 0x79, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x38, 0x0a, 0x05, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x4a, 0x57, + 0x54, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x1c, 0x0a, + 0x18, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x58, 0x35, 0x30, 0x39, 0x43, 0x65, 0x72, 0x74, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x01, 0x22, 0x2c, 0x0a, 0x06, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0f, 0x0a, 0x0b, 0x58, 0x35, 0x30, 0x39, 0x43, 0x65, 0x72, + 0x74, 0x44, 0x65, 0x72, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x4b, 0x49, 0x58, 0x50, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x10, 0x01, 0x1a, 0xa3, 0x09, 0x0a, 0x0c, 0x50, 0x6f, + 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x74, 0x79, 0x70, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x79, 0x70, 0x65, 0x49, 0x64, 0x12, 0x41, 0x0a, 0x03, 0x6d, 0x61, 0x63, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, + 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x4d, + 0x61, 0x63, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x63, 0x12, 0x41, 0x0a, 0x03, 0x6d, 0x66, 0x61, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, + 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x2e, 0x4d, 0x66, 0x61, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x66, 0x61, 0x12, 0x4a, 0x0a, 0x06, + 0x6f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x7a, + 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, + 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x4f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, + 0x52, 0x06, 0x6f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x4d, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x7a, 0x69, 0x74, 0x69, + 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x07, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x5c, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, + 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, + 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, + 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x48, 0x00, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x12, 0x4d, 0x0a, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, + 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x07, 0x64, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x73, 0x1a, 0x29, 0x0a, 0x03, 0x4d, 0x61, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x6d, + 0x61, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, + 0xaf, 0x01, 0x0a, 0x03, 0x4d, 0x66, 0x61, 0x12, 0x26, 0x0a, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, + 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x57, 0x61, 0x6b, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x57, + 0x61, 0x6b, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x55, + 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x50, 0x72, 0x6f, + 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x34, 0x0a, 0x15, 0x49, + 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x45, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x49, 0x67, 0x6e, 0x6f, + 0x72, 0x65, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x73, 0x1a, 0x3c, 0x0a, 0x02, 0x4f, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x73, 0x54, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x1e, 0x0a, 0x0a, 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0a, 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, + 0x4e, 0x0a, 0x06, 0x4f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x44, 0x0a, 0x06, 0x6f, 0x73, 0x4c, + 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x7a, 0x69, 0x74, 0x69, + 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x4f, 0x73, 0x52, 0x06, 0x6f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x1a, + 0x71, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x73, + 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x73, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x22, + 0x0a, 0x0c, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, + 0x74, 0x73, 0x1a, 0x7b, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, + 0x74, 0x69, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x12, 0x4f, + 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x31, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, + 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, + 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x50, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, + 0x23, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x64, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x2c, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x10, + 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x10, 0x02, 0x22, 0xfd, 0x01, + 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, + 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, + 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x65, 0x72, 0x74, 0x46, 0x69, 0x6e, 0x67, 0x65, + 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x63, + 0x65, 0x72, 0x74, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, + 0x12, 0x0a, 0x04, 0x75, 0x72, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x75, + 0x72, 0x6c, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, + 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x70, 0x69, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x5e, 0x0a, + 0x0a, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x65, 0x72, 0x74, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, + 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x63, 0x65, 0x72, + 0x74, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x74, 0x0a, + 0x0f, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x65, 0x64, + 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, + 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x69, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x54, 0x0a, 0x11, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, + 0x62, 0x2e, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x61, 0x70, + 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3d, 0x0a, 0x11, 0x41, 0x70, 0x69, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x16, + 0x0a, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x2d, 0x0a, 0x13, 0x41, 0x70, 0x69, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0x3a, 0x0a, 0x0e, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x73, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, + 0x69, 0x64, 0x73, 0x22, 0x2d, 0x0a, 0x13, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x22, 0xcc, 0x02, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, + 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, + 0x6e, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x14, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, + 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x14, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, + 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x7a, 0x69, 0x74, 0x69, + 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x70, + 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0xe1, 0x02, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, + 0x75, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, + 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x52, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, + 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, - 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, - 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe1, 0x02, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, - 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x52, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, - 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, - 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x46, 0x0a, 0x04, 0x74, 0x61, - 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, - 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, - 0x67, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, + 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x46, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, + 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, + 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, + 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc3, 0x03, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, + 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6e, + 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x54, 0x0a, 0x08, 0x70, 0x65, 0x65, + 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x7a, 0x69, + 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, + 0x6f, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, + 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, + 0x52, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, + 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x1a, 0x3b, + 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe1, 0x03, 0x0a, 0x19, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, + 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, + 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, + 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x56, 0x0a, 0x08, 0x70, + 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, + 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x6f, 0x72, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, 0x72, + 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, + 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, + 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, + 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, + 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, + 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, + 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x70, 0x69, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x99, 0x03, 0x0a, 0x17, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, - 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, - 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x54, 0x0a, 0x08, - 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, - 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, - 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, - 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x95, 0x01, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x61, 0x74, 0x6f, 0x72, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, + 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, + 0x49, 0x64, 0x12, 0x41, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, + 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x22, 0xaf, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, + 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, + 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x74, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, + 0x28, 0x0a, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xd8, 0x02, 0x0a, 0x17, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, + 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x22, 0x0a, + 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, + 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, + 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, + 0x63, 0x65, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2a, + 0x0a, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, + 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x70, + 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xcc, 0x01, 0x0a, 0x12, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, + 0x6e, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, + 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x50, 0x61, 0x73, 0x73, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x50, 0x61, 0x73, 0x73, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x70, 0x69, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x22, 0x3f, 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, + 0x0a, 0x0d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x73, 0x22, 0x9d, 0x01, 0x0a, 0x07, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x61, 0x72, 0x63, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x4f, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x73, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x73, 0x52, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x22, 0xa1, 0x01, 0x0a, 0x07, 0x53, 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x14, 0x0a, 0x05, 0x41, 0x70, 0x70, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x41, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x41, 0x70, 0x70, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x1a, + 0x0a, 0x08, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, + 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa7, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x07, 0x65, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, + 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x07, 0x65, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x34, 0x0a, 0x07, 0x73, 0x64, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, + 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, + 0x53, 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x73, 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, 0x70, + 0x65, 0x73, 0x22, 0x8a, 0x06, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x36, 0x0a, 0x16, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x16, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x63, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, + 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, + 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x18, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, + 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, + 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x43, 0x6f, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x44, 0x61, 0x74, 0x61, 0x4a, + 0x73, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x70, 0x70, 0x44, 0x61, + 0x74, 0x61, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x73, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, + 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x61, 0x0a, 0x0c, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x3d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, + 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x1a, 0x6e, + 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, + 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3d, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, - 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, - 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, - 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, - 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb7, 0x03, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, - 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x22, 0x0a, 0x0c, - 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, - 0x69, 0x6e, 0x74, 0x73, 0x12, 0x56, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, + 0x6e, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, + 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0xae, 0x02, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, + 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x14, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x14, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x5b, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, + 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, + 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, 0x72, + 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, + 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x4b, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x90, 0x04, + 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, + 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x4b, 0x0a, 0x0a, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, + 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x42, + 0x0a, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x28, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, + 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x5c, 0x0a, 0x08, 0x70, 0x65, + 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x7a, + 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, + 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x50, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x32, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, - 0x63, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, - 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, - 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x70, - 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x95, - 0x01, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x6f, 0x72, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, - 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, - 0x64, 0x12, 0x41, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x29, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, - 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, - 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x22, 0x85, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, - 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, - 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x65, - 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0xae, - 0x02, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x22, - 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, - 0x74, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, - 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, - 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x04, + 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, + 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x6c, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, + 0x12, 0x1e, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x12, 0x3c, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, + 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0xa1, + 0x01, 0x0a, 0x0d, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x6e, 0x63, 0x72, + 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x74, 0x61, + 0x67, 0x73, 0x22, 0xd5, 0x03, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, + 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x5a, + 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x3e, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, + 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, + 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, + 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x47, + 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, + 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, + 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x70, 0x72, 0x65, + 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x1a, 0x3b, 0x0a, + 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf3, 0x01, 0x0a, 0x1e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, + 0x0a, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2b, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, + 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, + 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x07, 0x73, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x7a, 0x69, + 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, + 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, + 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, + 0x22, 0xec, 0x01, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, + 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x72, - 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, + 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, - 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x75, + 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, - 0x1e, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x18, 0x07, 0x20, + 0x1e, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x22, - 0xa2, 0x01, 0x0a, 0x12, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, - 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x22, - 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, - 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x61, 0x73, 0x73, 0x65, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x61, - 0x73, 0x73, 0x65, 0x64, 0x22, 0x3f, 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x24, 0x0a, 0x0d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0x9d, 0x01, 0x0a, 0x07, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x61, 0x72, 0x63, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x4f, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x73, 0x52, 0x65, 0x6c, 0x65, 0x61, - 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x73, 0x52, 0x65, 0x6c, 0x65, - 0x61, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0xa1, 0x01, 0x0a, 0x07, 0x53, 0x64, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x70, 0x70, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x41, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x70, 0x70, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x41, 0x70, 0x70, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x42, 0x72, 0x61, 0x6e, 0x63, - 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, - 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa7, 0x01, 0x0a, 0x17, 0x43, 0x72, + 0x9d, 0x01, 0x0a, 0x1d, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x43, + 0x73, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x43, 0x65, 0x72, 0x74, 0x43, 0x73, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x43, 0x65, 0x72, 0x74, 0x43, 0x73, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x43, 0x73, 0x72, 0x12, 0x30, 0x0a, + 0x13, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x85, 0x01, 0x0a, 0x17, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x65, + 0x72, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, + 0x6d, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x50, + 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x43, 0x65, 0x72, + 0x74, 0x73, 0x50, 0x65, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x43, + 0x65, 0x72, 0x74, 0x73, 0x50, 0x65, 0x6d, 0x22, 0x4b, 0x0a, 0x23, 0x45, 0x6e, 0x72, 0x6f, 0x6c, + 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x72, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, + 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, + 0x74, 0x50, 0x65, 0x6d, 0x2a, 0x9e, 0x0b, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x15, + 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x79, 0x70, + 0x65, 0x10, 0xa0, 0x9c, 0x01, 0x12, 0x15, 0x0a, 0x0f, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, + 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x10, 0xa1, 0x9c, 0x01, 0x12, 0x0f, 0x0a, 0x09, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x10, 0xa2, 0x9c, 0x01, 0x12, 0x18, 0x0a, + 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x54, + 0x79, 0x70, 0x65, 0x10, 0x86, 0x9d, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x41, 0x70, 0x69, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x10, 0xe8, + 0x9d, 0x01, 0x12, 0x1b, 0x0a, 0x15, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x10, 0xe9, 0x9d, 0x01, 0x12, + 0x1b, 0x0a, 0x15, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x10, 0xea, 0x9d, 0x01, 0x12, 0x1d, 0x0a, 0x17, + 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, + 0x65, 0x61, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xeb, 0x9d, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x53, 0x79, + 0x6e, 0x63, 0x54, 0x79, 0x70, 0x65, 0x10, 0xec, 0x9d, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xed, 0x9d, 0x01, 0x12, 0x1f, 0x0a, 0x19, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xee, 0x9d, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xef, 0x9d, 0x01, 0x12, 0x22, + 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf0, + 0x9d, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x10, 0xf1, 0x9d, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf2, 0x9d, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf3, 0x9d, 0x01, 0x12, 0x22, 0x0a, 0x1c, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf4, 0x9d, 0x01, + 0x12, 0x21, 0x0a, 0x1b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, + 0xf5, 0x9d, 0x01, 0x12, 0x15, 0x0a, 0x0f, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf6, 0x9d, 0x01, 0x12, 0x23, 0x0a, 0x1d, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x32, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf8, 0x9d, 0x01, 0x12, + 0x24, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, + 0x74, 0x6f, 0x72, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x10, 0xf9, 0x9d, 0x01, 0x12, 0x20, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, + 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x10, 0xfa, 0x9d, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xfb, 0x9d, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x45, 0x6e, + 0x72, 0x6f, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x10, 0xcc, 0x9e, 0x01, 0x12, 0x21, 0x0a, 0x1b, + 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xcd, 0x9e, 0x01, 0x12, + 0x27, 0x0a, 0x21, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x10, 0xce, 0x9e, 0x01, 0x12, 0x2d, 0x0a, 0x27, 0x45, 0x6e, 0x72, 0x6f, + 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x52, 0x6f, 0x75, 0x74, + 0x65, 0x72, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x10, 0xcf, 0x9e, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb0, 0x9f, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x07, 0x65, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, - 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x07, 0x65, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x34, 0x0a, 0x07, 0x73, - 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, - 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, - 0x2e, 0x53, 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x73, 0x64, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, - 0x70, 0x65, 0x73, 0x22, 0x8a, 0x06, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, - 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x36, 0x0a, 0x16, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x1e, 0x0a, 0x0a, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x63, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, - 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, - 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x18, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, - 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x44, 0x61, 0x74, 0x61, - 0x4a, 0x73, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x70, 0x70, 0x44, - 0x61, 0x74, 0x61, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x73, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x09, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, - 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, - 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, - 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x61, 0x0a, 0x0c, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, - 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x1a, - 0x6e, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, - 0x65, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3d, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, - 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, - 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, - 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x3f, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0xae, 0x02, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, - 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x14, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, - 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x14, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x5b, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, - 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x7a, 0x69, 0x74, 0x69, - 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, - 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, - 0x44, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x4b, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x90, - 0x04, 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, - 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0a, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, - 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x42, 0x0a, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x28, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, - 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, - 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x5c, 0x0a, 0x08, 0x70, - 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, - 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, - 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x50, 0x0a, 0x04, 0x74, 0x61, 0x67, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, - 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb1, 0x9f, 0x01, 0x12, 0x28, + 0x0a, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, + 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x10, 0xb2, 0x9f, 0x01, 0x12, 0x29, 0x0a, 0x23, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x67, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, - 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x6c, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x4c, 0x69, 0x73, - 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x12, 0x3c, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, - 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, - 0xa1, 0x01, 0x0a, 0x0d, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x6e, 0x63, 0x72, 0x79, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x6e, 0x63, - 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x74, - 0x61, 0x67, 0x73, 0x22, 0xd5, 0x03, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, - 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x5a, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x3e, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, - 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, - 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x63, - 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, - 0x47, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, - 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, - 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x70, 0x72, - 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x1a, 0x3b, - 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf3, 0x01, 0x0a, 0x1e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, - 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, - 0x0a, 0x0a, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, - 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, - 0x0a, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x07, 0x73, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x7a, - 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x22, 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, - 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x22, 0xec, 0x01, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, - 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, - 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, - 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x70, - 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, - 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, - 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, - 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, - 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, - 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x73, 0x74, - 0x22, 0x9d, 0x01, 0x0a, 0x1d, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, - 0x43, 0x73, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x43, 0x65, 0x72, 0x74, 0x43, 0x73, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x43, 0x73, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x43, 0x73, 0x72, 0x12, 0x30, - 0x0a, 0x13, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x72, 0x65, 0x71, - 0x75, 0x69, 0x72, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x85, 0x01, 0x0a, 0x17, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x43, - 0x65, 0x72, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x50, - 0x65, 0x6d, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, - 0x50, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x43, 0x65, - 0x72, 0x74, 0x73, 0x50, 0x65, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, - 0x43, 0x65, 0x72, 0x74, 0x73, 0x50, 0x65, 0x6d, 0x22, 0x4b, 0x0a, 0x23, 0x45, 0x6e, 0x72, 0x6f, - 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x52, 0x6f, 0x75, 0x74, - 0x65, 0x72, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x24, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, - 0x72, 0x74, 0x50, 0x65, 0x6d, 0x2a, 0xf4, 0x0a, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, - 0x15, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x79, - 0x70, 0x65, 0x10, 0xa0, 0x9c, 0x01, 0x12, 0x15, 0x0a, 0x0f, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x10, 0xa1, 0x9c, 0x01, 0x12, 0x0f, 0x0a, - 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x10, 0xa2, 0x9c, 0x01, 0x12, 0x18, - 0x0a, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, - 0x54, 0x79, 0x70, 0x65, 0x10, 0x86, 0x9d, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x41, 0x70, 0x69, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x10, - 0xe8, 0x9d, 0x01, 0x12, 0x1b, 0x0a, 0x15, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x10, 0xe9, 0x9d, 0x01, - 0x12, 0x1b, 0x0a, 0x15, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x10, 0xea, 0x9d, 0x01, 0x12, 0x1d, 0x0a, - 0x17, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x72, 0x74, - 0x62, 0x65, 0x61, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xeb, 0x9d, 0x01, 0x12, 0x1d, 0x0a, 0x17, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x53, - 0x79, 0x6e, 0x63, 0x54, 0x79, 0x70, 0x65, 0x10, 0xec, 0x9d, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xed, 0x9d, 0x01, 0x12, 0x1f, 0x0a, 0x19, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xee, 0x9d, 0x01, 0x12, 0x21, 0x0a, 0x1b, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xef, 0x9d, 0x01, 0x12, - 0x22, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, - 0xf0, 0x9d, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, - 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x10, 0xf1, 0x9d, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf2, 0x9d, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf3, 0x9d, 0x01, 0x12, 0x22, 0x0a, - 0x1c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf4, 0x9d, - 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x10, 0xf5, 0x9d, 0x01, 0x12, 0x15, 0x0a, 0x0f, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf6, 0x9d, 0x01, 0x12, 0x1a, 0x0a, 0x14, 0x53, - 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x41, 0x64, 0x64, 0x65, 0x64, 0x54, - 0x79, 0x70, 0x65, 0x10, 0xf7, 0x9d, 0x01, 0x12, 0x23, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x32, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf8, 0x9d, 0x01, 0x12, 0x24, 0x0a, 0x1e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, - 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf9, - 0x9d, 0x01, 0x12, 0x20, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, - 0x75, 0x69, 0x74, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x10, 0xfa, 0x9d, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, - 0x72, 0x63, 0x75, 0x69, 0x74, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x10, 0xfb, 0x9d, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x45, 0x6e, 0x72, 0x6f, 0x6c, - 0x6c, 0x54, 0x79, 0x70, 0x65, 0x10, 0xcc, 0x9e, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x45, 0x6e, 0x72, - 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xcd, 0x9e, 0x01, 0x12, 0x27, 0x0a, 0x21, - 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, - 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x10, 0xce, 0x9e, 0x01, 0x12, 0x2d, 0x0a, 0x27, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, - 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x10, 0xcf, 0x9e, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, - 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, - 0x79, 0x70, 0x65, 0x10, 0xb0, 0x9f, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb1, 0x9f, 0x01, 0x12, 0x28, 0x0a, 0x22, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x10, 0xb2, 0x9f, 0x01, 0x12, 0x29, 0x0a, 0x23, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, - 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb3, 0x9f, 0x01, - 0x12, 0x1d, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb4, 0x9f, 0x01, 0x12, - 0x15, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x10, 0xb5, 0x9f, 0x01, 0x12, 0x27, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb6, 0x9f, 0x01, 0x12, - 0x28, 0x0a, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, - 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb7, 0x9f, 0x01, 0x12, 0x27, 0x0a, 0x21, 0x55, 0x70, 0x64, + 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, + 0xb3, 0x9f, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb4, + 0x9f, 0x01, 0x12, 0x15, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb5, 0x9f, 0x01, 0x12, 0x27, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb8, - 0x9f, 0x01, 0x12, 0x28, 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, + 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb6, + 0x9f, 0x01, 0x12, 0x28, 0x0a, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb9, 0x9f, 0x01, 0x12, 0x27, 0x0a, 0x21, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, + 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb7, 0x9f, 0x01, 0x12, 0x27, 0x0a, 0x21, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x10, 0xba, 0x9f, 0x01, 0x12, 0x28, 0x0a, 0x22, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, + 0x65, 0x10, 0xb8, 0x9f, 0x01, 0x12, 0x28, 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xbb, 0x9f, 0x01, 0x12, - 0x1b, 0x0a, 0x15, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xbc, 0x9f, 0x01, 0x2a, 0x21, 0x0a, 0x0b, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x44, - 0x69, 0x61, 0x6c, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x69, 0x6e, 0x64, 0x10, 0x01, 0x2a, - 0x3d, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x0a, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0c, 0x54, 0x65, 0x72, - 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x10, 0xfe, 0x07, 0x12, 0x10, 0x0a, 0x0b, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x61, 0x73, 0x73, 0x65, 0x64, 0x10, 0xff, 0x07, 0x2a, 0x2e, - 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, - 0x41, 0x64, 0x64, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x10, - 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x10, 0x02, 0x2a, 0x3d, - 0x0a, 0x14, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, - 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x10, - 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x02, 0x2a, 0x5c, 0x0a, - 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, - 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x49, 0x64, - 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x46, - 0x61, 0x69, 0x6c, 0x65, 0x64, 0x42, 0x75, 0x73, 0x79, 0x10, 0x03, 0x42, 0x2a, 0x5a, 0x28, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x7a, 0x69, - 0x74, 0x69, 0x2f, 0x65, 0x64, 0x67, 0x65, 0x2f, 0x70, 0x62, 0x2f, 0x65, 0x64, 0x67, 0x65, 0x5f, - 0x63, 0x74, 0x72, 0x6c, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb9, 0x9f, 0x01, 0x12, + 0x27, 0x0a, 0x21, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x10, 0xba, 0x9f, 0x01, 0x12, 0x28, 0x0a, 0x22, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xbb, + 0x9f, 0x01, 0x12, 0x1b, 0x0a, 0x15, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xbc, 0x9f, 0x01, 0x12, + 0x13, 0x0a, 0x0d, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x10, 0x94, 0xa0, 0x01, 0x12, 0x18, 0x0a, 0x12, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0x95, 0xa0, 0x01, 0x12, 0x15, + 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, + 0x65, 0x10, 0x96, 0xa0, 0x01, 0x2a, 0x21, 0x0a, 0x0b, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x69, 0x61, 0x6c, 0x10, 0x00, 0x12, 0x08, + 0x0a, 0x04, 0x42, 0x69, 0x6e, 0x64, 0x10, 0x01, 0x2a, 0x6e, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5a, 0x65, 0x72, 0x6f, + 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, + 0x49, 0x64, 0x10, 0xfe, 0x07, 0x12, 0x10, 0x0a, 0x0b, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x61, + 0x73, 0x73, 0x65, 0x64, 0x10, 0xff, 0x07, 0x12, 0x14, 0x0a, 0x0f, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x72, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x10, 0x80, 0x08, 0x12, 0x19, 0x0a, + 0x14, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x10, 0x81, 0x08, 0x2a, 0x3d, 0x0a, 0x14, 0x54, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, + 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12, 0x0c, 0x0a, + 0x08, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x02, 0x2a, 0x5c, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, 0x12, 0x14, + 0x0a, 0x10, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x49, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, + 0x63, 0x74, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x74, + 0x68, 0x65, 0x72, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x42, + 0x75, 0x73, 0x79, 0x10, 0x03, 0x42, 0x31, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x7a, 0x69, 0x74, 0x69, 0x2f, 0x7a, 0x69, 0x74, + 0x69, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x62, 0x2f, 0x65, 0x64, 0x67, 0x65, + 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4137,122 +5191,147 @@ func file_edge_ctrl_proto_rawDescGZIP() []byte { return file_edge_ctrl_proto_rawDescData } -var file_edge_ctrl_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_edge_ctrl_proto_msgTypes = make([]protoimpl.MessageInfo, 58) +var file_edge_ctrl_proto_enumTypes = make([]protoimpl.EnumInfo, 8) +var file_edge_ctrl_proto_msgTypes = make([]protoimpl.MessageInfo, 67) var file_edge_ctrl_proto_goTypes = []interface{}{ (ContentType)(0), // 0: ziti.edge_ctrl.pb.ContentType (SessionType)(0), // 1: ziti.edge_ctrl.pb.SessionType (Header)(0), // 2: ziti.edge_ctrl.pb.Header - (ConfigType)(0), // 3: ziti.edge_ctrl.pb.ConfigType - (TerminatorPrecedence)(0), // 4: ziti.edge_ctrl.pb.TerminatorPrecedence - (CreateTerminatorResult)(0), // 5: ziti.edge_ctrl.pb.CreateTerminatorResult - (*ServerHello)(nil), // 6: ziti.edge_ctrl.pb.ServerHello - (*Address)(nil), // 7: ziti.edge_ctrl.pb.Address - (*Listener)(nil), // 8: ziti.edge_ctrl.pb.Listener - (*ClientHello)(nil), // 9: ziti.edge_ctrl.pb.ClientHello - (*Error)(nil), // 10: ziti.edge_ctrl.pb.Error - (*Service)(nil), // 11: ziti.edge_ctrl.pb.Service - (*Config)(nil), // 12: ziti.edge_ctrl.pb.Config - (*SignerCerts)(nil), // 13: ziti.edge_ctrl.pb.SignerCerts - (*Identity)(nil), // 14: ziti.edge_ctrl.pb.Identity - (*PostureSet)(nil), // 15: ziti.edge_ctrl.pb.PostureSet - (*PostureCheck)(nil), // 16: ziti.edge_ctrl.pb.PostureCheck - (*Session)(nil), // 17: ziti.edge_ctrl.pb.Session - (*ApiSession)(nil), // 18: ziti.edge_ctrl.pb.ApiSession - (*ApiSessionAdded)(nil), // 19: ziti.edge_ctrl.pb.ApiSessionAdded - (*ApiSessionUpdated)(nil), // 20: ziti.edge_ctrl.pb.ApiSessionUpdated - (*ApiSessionRemoved)(nil), // 21: ziti.edge_ctrl.pb.ApiSessionRemoved - (*ApiSessionHeartbeat)(nil), // 22: ziti.edge_ctrl.pb.ApiSessionHeartbeat - (*SessionRemoved)(nil), // 23: ziti.edge_ctrl.pb.SessionRemoved - (*RequestClientReSync)(nil), // 24: ziti.edge_ctrl.pb.RequestClientReSync - (*CreateCircuitRequest)(nil), // 25: ziti.edge_ctrl.pb.CreateCircuitRequest - (*CreateCircuitResponse)(nil), // 26: ziti.edge_ctrl.pb.CreateCircuitResponse - (*CreateTerminatorRequest)(nil), // 27: ziti.edge_ctrl.pb.CreateTerminatorRequest - (*CreateTerminatorV2Request)(nil), // 28: ziti.edge_ctrl.pb.CreateTerminatorV2Request - (*CreateTerminatorV2Response)(nil), // 29: ziti.edge_ctrl.pb.CreateTerminatorV2Response - (*RemoveTerminatorRequest)(nil), // 30: ziti.edge_ctrl.pb.RemoveTerminatorRequest - (*UpdateTerminatorRequest)(nil), // 31: ziti.edge_ctrl.pb.UpdateTerminatorRequest - (*HealthEventRequest)(nil), // 32: ziti.edge_ctrl.pb.HealthEventRequest - (*ValidateSessionsRequest)(nil), // 33: ziti.edge_ctrl.pb.ValidateSessionsRequest - (*EnvInfo)(nil), // 34: ziti.edge_ctrl.pb.EnvInfo - (*SdkInfo)(nil), // 35: ziti.edge_ctrl.pb.SdkInfo - (*CreateApiSessionRequest)(nil), // 36: ziti.edge_ctrl.pb.CreateApiSessionRequest - (*CreateApiSessionResponse)(nil), // 37: ziti.edge_ctrl.pb.CreateApiSessionResponse - (*CreateCircuitForServiceRequest)(nil), // 38: ziti.edge_ctrl.pb.CreateCircuitForServiceRequest - (*CreateSessionResponse)(nil), // 39: ziti.edge_ctrl.pb.CreateSessionResponse - (*CreateCircuitForServiceResponse)(nil), // 40: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse - (*ServicesList)(nil), // 41: ziti.edge_ctrl.pb.ServicesList - (*TunnelService)(nil), // 42: ziti.edge_ctrl.pb.TunnelService - (*CreateTunnelTerminatorRequest)(nil), // 43: ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest - (*CreateTunnelTerminatorResponse)(nil), // 44: ziti.edge_ctrl.pb.CreateTunnelTerminatorResponse - (*UpdateTunnelTerminatorRequest)(nil), // 45: ziti.edge_ctrl.pb.UpdateTunnelTerminatorRequest - (*EnrollmentExtendRouterRequest)(nil), // 46: ziti.edge_ctrl.pb.EnrollmentExtendRouterRequest - (*EnrollmentCertsResponse)(nil), // 47: ziti.edge_ctrl.pb.EnrollmentCertsResponse - (*EnrollmentExtendRouterVerifyRequest)(nil), // 48: ziti.edge_ctrl.pb.EnrollmentExtendRouterVerifyRequest - nil, // 49: ziti.edge_ctrl.pb.ServerHello.DataEntry - nil, // 50: ziti.edge_ctrl.pb.ServerHello.ByteDataEntry - nil, // 51: ziti.edge_ctrl.pb.ClientHello.DataEntry - nil, // 52: ziti.edge_ctrl.pb.PostureCheck.DataEntry - nil, // 53: ziti.edge_ctrl.pb.CreateCircuitRequest.PeerDataEntry - nil, // 54: ziti.edge_ctrl.pb.CreateCircuitResponse.PeerDataEntry - nil, // 55: ziti.edge_ctrl.pb.CreateCircuitResponse.TagsEntry - nil, // 56: ziti.edge_ctrl.pb.CreateTerminatorRequest.PeerDataEntry - nil, // 57: ziti.edge_ctrl.pb.CreateTerminatorV2Request.PeerDataEntry - nil, // 58: ziti.edge_ctrl.pb.CreateApiSessionResponse.ServicePrecedencesEntry - nil, // 59: ziti.edge_ctrl.pb.CreateApiSessionResponse.ServiceCostsEntry - nil, // 60: ziti.edge_ctrl.pb.CreateCircuitForServiceRequest.PeerDataEntry - nil, // 61: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.PeerDataEntry - nil, // 62: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.TagsEntry - nil, // 63: ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest.PeerDataEntry + (TerminatorPrecedence)(0), // 3: ziti.edge_ctrl.pb.TerminatorPrecedence + (CreateTerminatorResult)(0), // 4: ziti.edge_ctrl.pb.CreateTerminatorResult + (DataState_Action)(0), // 5: ziti.edge_ctrl.pb.DataState.Action + (DataState_PublicKey_Usage)(0), // 6: ziti.edge_ctrl.pb.DataState.PublicKey.Usage + (DataState_PublicKey_Format)(0), // 7: ziti.edge_ctrl.pb.DataState.PublicKey.Format + (*ServerHello)(nil), // 8: ziti.edge_ctrl.pb.ServerHello + (*Address)(nil), // 9: ziti.edge_ctrl.pb.Address + (*Listener)(nil), // 10: ziti.edge_ctrl.pb.Listener + (*ClientHello)(nil), // 11: ziti.edge_ctrl.pb.ClientHello + (*Error)(nil), // 12: ziti.edge_ctrl.pb.Error + (*Service)(nil), // 13: ziti.edge_ctrl.pb.Service + (*DataState)(nil), // 14: ziti.edge_ctrl.pb.DataState + (*Session)(nil), // 15: ziti.edge_ctrl.pb.Session + (*ApiSession)(nil), // 16: ziti.edge_ctrl.pb.ApiSession + (*ApiSessionAdded)(nil), // 17: ziti.edge_ctrl.pb.ApiSessionAdded + (*ApiSessionUpdated)(nil), // 18: ziti.edge_ctrl.pb.ApiSessionUpdated + (*ApiSessionRemoved)(nil), // 19: ziti.edge_ctrl.pb.ApiSessionRemoved + (*ApiSessionHeartbeat)(nil), // 20: ziti.edge_ctrl.pb.ApiSessionHeartbeat + (*SessionRemoved)(nil), // 21: ziti.edge_ctrl.pb.SessionRemoved + (*RequestClientReSync)(nil), // 22: ziti.edge_ctrl.pb.RequestClientReSync + (*CreateCircuitRequest)(nil), // 23: ziti.edge_ctrl.pb.CreateCircuitRequest + (*CreateCircuitResponse)(nil), // 24: ziti.edge_ctrl.pb.CreateCircuitResponse + (*CreateTerminatorRequest)(nil), // 25: ziti.edge_ctrl.pb.CreateTerminatorRequest + (*CreateTerminatorV2Request)(nil), // 26: ziti.edge_ctrl.pb.CreateTerminatorV2Request + (*CreateTerminatorV2Response)(nil), // 27: ziti.edge_ctrl.pb.CreateTerminatorV2Response + (*RemoveTerminatorRequest)(nil), // 28: ziti.edge_ctrl.pb.RemoveTerminatorRequest + (*UpdateTerminatorRequest)(nil), // 29: ziti.edge_ctrl.pb.UpdateTerminatorRequest + (*HealthEventRequest)(nil), // 30: ziti.edge_ctrl.pb.HealthEventRequest + (*ValidateSessionsRequest)(nil), // 31: ziti.edge_ctrl.pb.ValidateSessionsRequest + (*EnvInfo)(nil), // 32: ziti.edge_ctrl.pb.EnvInfo + (*SdkInfo)(nil), // 33: ziti.edge_ctrl.pb.SdkInfo + (*CreateApiSessionRequest)(nil), // 34: ziti.edge_ctrl.pb.CreateApiSessionRequest + (*CreateApiSessionResponse)(nil), // 35: ziti.edge_ctrl.pb.CreateApiSessionResponse + (*CreateCircuitForServiceRequest)(nil), // 36: ziti.edge_ctrl.pb.CreateCircuitForServiceRequest + (*CreateSessionResponse)(nil), // 37: ziti.edge_ctrl.pb.CreateSessionResponse + (*CreateCircuitForServiceResponse)(nil), // 38: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse + (*ServicesList)(nil), // 39: ziti.edge_ctrl.pb.ServicesList + (*TunnelService)(nil), // 40: ziti.edge_ctrl.pb.TunnelService + (*CreateTunnelTerminatorRequest)(nil), // 41: ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest + (*CreateTunnelTerminatorResponse)(nil), // 42: ziti.edge_ctrl.pb.CreateTunnelTerminatorResponse + (*UpdateTunnelTerminatorRequest)(nil), // 43: ziti.edge_ctrl.pb.UpdateTunnelTerminatorRequest + (*EnrollmentExtendRouterRequest)(nil), // 44: ziti.edge_ctrl.pb.EnrollmentExtendRouterRequest + (*EnrollmentCertsResponse)(nil), // 45: ziti.edge_ctrl.pb.EnrollmentCertsResponse + (*EnrollmentExtendRouterVerifyRequest)(nil), // 46: ziti.edge_ctrl.pb.EnrollmentExtendRouterVerifyRequest + nil, // 47: ziti.edge_ctrl.pb.ServerHello.DataEntry + nil, // 48: ziti.edge_ctrl.pb.ServerHello.ByteDataEntry + nil, // 49: ziti.edge_ctrl.pb.ClientHello.DataEntry + (*DataState_Identity)(nil), // 50: ziti.edge_ctrl.pb.DataState.Identity + (*DataState_Service)(nil), // 51: ziti.edge_ctrl.pb.DataState.Service + (*DataState_ServicePolicy)(nil), // 52: ziti.edge_ctrl.pb.DataState.ServicePolicy + (*DataState_Revocation)(nil), // 53: ziti.edge_ctrl.pb.DataState.Revocation + (*DataState_Event)(nil), // 54: ziti.edge_ctrl.pb.DataState.Event + (*DataState_PublicKey)(nil), // 55: ziti.edge_ctrl.pb.DataState.PublicKey + (*DataState_PostureCheck)(nil), // 56: ziti.edge_ctrl.pb.DataState.PostureCheck + (*DataState_PostureCheck_Mac)(nil), // 57: ziti.edge_ctrl.pb.DataState.PostureCheck.Mac + (*DataState_PostureCheck_Mfa)(nil), // 58: ziti.edge_ctrl.pb.DataState.PostureCheck.Mfa + (*DataState_PostureCheck_Os)(nil), // 59: ziti.edge_ctrl.pb.DataState.PostureCheck.Os + (*DataState_PostureCheck_OsList)(nil), // 60: ziti.edge_ctrl.pb.DataState.PostureCheck.OsList + (*DataState_PostureCheck_Process)(nil), // 61: ziti.edge_ctrl.pb.DataState.PostureCheck.Process + (*DataState_PostureCheck_ProcessMulti)(nil), // 62: ziti.edge_ctrl.pb.DataState.PostureCheck.ProcessMulti + (*DataState_PostureCheck_Domains)(nil), // 63: ziti.edge_ctrl.pb.DataState.PostureCheck.Domains + nil, // 64: ziti.edge_ctrl.pb.CreateCircuitRequest.PeerDataEntry + nil, // 65: ziti.edge_ctrl.pb.CreateCircuitResponse.PeerDataEntry + nil, // 66: ziti.edge_ctrl.pb.CreateCircuitResponse.TagsEntry + nil, // 67: ziti.edge_ctrl.pb.CreateTerminatorRequest.PeerDataEntry + nil, // 68: ziti.edge_ctrl.pb.CreateTerminatorV2Request.PeerDataEntry + nil, // 69: ziti.edge_ctrl.pb.CreateApiSessionResponse.ServicePrecedencesEntry + nil, // 70: ziti.edge_ctrl.pb.CreateApiSessionResponse.ServiceCostsEntry + nil, // 71: ziti.edge_ctrl.pb.CreateCircuitForServiceRequest.PeerDataEntry + nil, // 72: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.PeerDataEntry + nil, // 73: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.TagsEntry + nil, // 74: ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest.PeerDataEntry + (*timestamppb.Timestamp)(nil), // 75: google.protobuf.Timestamp } var file_edge_ctrl_proto_depIdxs = []int32{ - 49, // 0: ziti.edge_ctrl.pb.ServerHello.data:type_name -> ziti.edge_ctrl.pb.ServerHello.DataEntry - 50, // 1: ziti.edge_ctrl.pb.ServerHello.byteData:type_name -> ziti.edge_ctrl.pb.ServerHello.ByteDataEntry - 7, // 2: ziti.edge_ctrl.pb.Listener.address:type_name -> ziti.edge_ctrl.pb.Address - 7, // 3: ziti.edge_ctrl.pb.Listener.advertise:type_name -> ziti.edge_ctrl.pb.Address - 51, // 4: ziti.edge_ctrl.pb.ClientHello.data:type_name -> ziti.edge_ctrl.pb.ClientHello.DataEntry - 8, // 5: ziti.edge_ctrl.pb.ClientHello.listeners:type_name -> ziti.edge_ctrl.pb.Listener - 3, // 6: ziti.edge_ctrl.pb.Config.type:type_name -> ziti.edge_ctrl.pb.ConfigType - 14, // 7: ziti.edge_ctrl.pb.Config.identities:type_name -> ziti.edge_ctrl.pb.Identity - 11, // 8: ziti.edge_ctrl.pb.Config.services:type_name -> ziti.edge_ctrl.pb.Service - 15, // 9: ziti.edge_ctrl.pb.Config.postureSet:type_name -> ziti.edge_ctrl.pb.PostureSet - 16, // 10: ziti.edge_ctrl.pb.Config.postureChecks:type_name -> ziti.edge_ctrl.pb.PostureCheck - 52, // 11: ziti.edge_ctrl.pb.PostureCheck.data:type_name -> ziti.edge_ctrl.pb.PostureCheck.DataEntry - 1, // 12: ziti.edge_ctrl.pb.Session.type:type_name -> ziti.edge_ctrl.pb.SessionType - 11, // 13: ziti.edge_ctrl.pb.Session.service:type_name -> ziti.edge_ctrl.pb.Service - 18, // 14: ziti.edge_ctrl.pb.ApiSessionAdded.apiSessions:type_name -> ziti.edge_ctrl.pb.ApiSession - 18, // 15: ziti.edge_ctrl.pb.ApiSessionUpdated.apiSessions:type_name -> ziti.edge_ctrl.pb.ApiSession - 53, // 16: ziti.edge_ctrl.pb.CreateCircuitRequest.peerData:type_name -> ziti.edge_ctrl.pb.CreateCircuitRequest.PeerDataEntry - 54, // 17: ziti.edge_ctrl.pb.CreateCircuitResponse.peerData:type_name -> ziti.edge_ctrl.pb.CreateCircuitResponse.PeerDataEntry - 55, // 18: ziti.edge_ctrl.pb.CreateCircuitResponse.tags:type_name -> ziti.edge_ctrl.pb.CreateCircuitResponse.TagsEntry - 56, // 19: ziti.edge_ctrl.pb.CreateTerminatorRequest.peerData:type_name -> ziti.edge_ctrl.pb.CreateTerminatorRequest.PeerDataEntry - 4, // 20: ziti.edge_ctrl.pb.CreateTerminatorRequest.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence - 57, // 21: ziti.edge_ctrl.pb.CreateTerminatorV2Request.peerData:type_name -> ziti.edge_ctrl.pb.CreateTerminatorV2Request.PeerDataEntry - 4, // 22: ziti.edge_ctrl.pb.CreateTerminatorV2Request.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence - 5, // 23: ziti.edge_ctrl.pb.CreateTerminatorV2Response.result:type_name -> ziti.edge_ctrl.pb.CreateTerminatorResult - 4, // 24: ziti.edge_ctrl.pb.UpdateTerminatorRequest.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence - 34, // 25: ziti.edge_ctrl.pb.CreateApiSessionRequest.envInfo:type_name -> ziti.edge_ctrl.pb.EnvInfo - 35, // 26: ziti.edge_ctrl.pb.CreateApiSessionRequest.sdkInfo:type_name -> ziti.edge_ctrl.pb.SdkInfo - 4, // 27: ziti.edge_ctrl.pb.CreateApiSessionResponse.defaultHostingPrecedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence - 58, // 28: ziti.edge_ctrl.pb.CreateApiSessionResponse.servicePrecedences:type_name -> ziti.edge_ctrl.pb.CreateApiSessionResponse.ServicePrecedencesEntry - 59, // 29: ziti.edge_ctrl.pb.CreateApiSessionResponse.serviceCosts:type_name -> ziti.edge_ctrl.pb.CreateApiSessionResponse.ServiceCostsEntry - 60, // 30: ziti.edge_ctrl.pb.CreateCircuitForServiceRequest.peerData:type_name -> ziti.edge_ctrl.pb.CreateCircuitForServiceRequest.PeerDataEntry - 37, // 31: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.apiSession:type_name -> ziti.edge_ctrl.pb.CreateApiSessionResponse - 39, // 32: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.session:type_name -> ziti.edge_ctrl.pb.CreateSessionResponse - 61, // 33: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.peerData:type_name -> ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.PeerDataEntry - 62, // 34: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.tags:type_name -> ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.TagsEntry - 42, // 35: ziti.edge_ctrl.pb.ServicesList.services:type_name -> ziti.edge_ctrl.pb.TunnelService - 63, // 36: ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest.peerData:type_name -> ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest.PeerDataEntry - 4, // 37: ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence - 37, // 38: ziti.edge_ctrl.pb.CreateTunnelTerminatorResponse.apiSession:type_name -> ziti.edge_ctrl.pb.CreateApiSessionResponse - 39, // 39: ziti.edge_ctrl.pb.CreateTunnelTerminatorResponse.session:type_name -> ziti.edge_ctrl.pb.CreateSessionResponse - 4, // 40: ziti.edge_ctrl.pb.UpdateTunnelTerminatorRequest.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence - 4, // 41: ziti.edge_ctrl.pb.CreateApiSessionResponse.ServicePrecedencesEntry.value:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence - 42, // [42:42] is the sub-list for method output_type - 42, // [42:42] is the sub-list for method input_type - 42, // [42:42] is the sub-list for extension type_name - 42, // [42:42] is the sub-list for extension extendee - 0, // [0:42] is the sub-list for field type_name + 47, // 0: ziti.edge_ctrl.pb.ServerHello.data:type_name -> ziti.edge_ctrl.pb.ServerHello.DataEntry + 48, // 1: ziti.edge_ctrl.pb.ServerHello.byteData:type_name -> ziti.edge_ctrl.pb.ServerHello.ByteDataEntry + 9, // 2: ziti.edge_ctrl.pb.Listener.address:type_name -> ziti.edge_ctrl.pb.Address + 9, // 3: ziti.edge_ctrl.pb.Listener.advertise:type_name -> ziti.edge_ctrl.pb.Address + 49, // 4: ziti.edge_ctrl.pb.ClientHello.data:type_name -> ziti.edge_ctrl.pb.ClientHello.DataEntry + 10, // 5: ziti.edge_ctrl.pb.ClientHello.listeners:type_name -> ziti.edge_ctrl.pb.Listener + 54, // 6: ziti.edge_ctrl.pb.DataState.events:type_name -> ziti.edge_ctrl.pb.DataState.Event + 1, // 7: ziti.edge_ctrl.pb.Session.type:type_name -> ziti.edge_ctrl.pb.SessionType + 13, // 8: ziti.edge_ctrl.pb.Session.service:type_name -> ziti.edge_ctrl.pb.Service + 16, // 9: ziti.edge_ctrl.pb.ApiSessionAdded.apiSessions:type_name -> ziti.edge_ctrl.pb.ApiSession + 16, // 10: ziti.edge_ctrl.pb.ApiSessionUpdated.apiSessions:type_name -> ziti.edge_ctrl.pb.ApiSession + 64, // 11: ziti.edge_ctrl.pb.CreateCircuitRequest.peerData:type_name -> ziti.edge_ctrl.pb.CreateCircuitRequest.PeerDataEntry + 65, // 12: ziti.edge_ctrl.pb.CreateCircuitResponse.peerData:type_name -> ziti.edge_ctrl.pb.CreateCircuitResponse.PeerDataEntry + 66, // 13: ziti.edge_ctrl.pb.CreateCircuitResponse.tags:type_name -> ziti.edge_ctrl.pb.CreateCircuitResponse.TagsEntry + 67, // 14: ziti.edge_ctrl.pb.CreateTerminatorRequest.peerData:type_name -> ziti.edge_ctrl.pb.CreateTerminatorRequest.PeerDataEntry + 3, // 15: ziti.edge_ctrl.pb.CreateTerminatorRequest.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence + 68, // 16: ziti.edge_ctrl.pb.CreateTerminatorV2Request.peerData:type_name -> ziti.edge_ctrl.pb.CreateTerminatorV2Request.PeerDataEntry + 3, // 17: ziti.edge_ctrl.pb.CreateTerminatorV2Request.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence + 4, // 18: ziti.edge_ctrl.pb.CreateTerminatorV2Response.result:type_name -> ziti.edge_ctrl.pb.CreateTerminatorResult + 3, // 19: ziti.edge_ctrl.pb.UpdateTerminatorRequest.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence + 32, // 20: ziti.edge_ctrl.pb.CreateApiSessionRequest.envInfo:type_name -> ziti.edge_ctrl.pb.EnvInfo + 33, // 21: ziti.edge_ctrl.pb.CreateApiSessionRequest.sdkInfo:type_name -> ziti.edge_ctrl.pb.SdkInfo + 3, // 22: ziti.edge_ctrl.pb.CreateApiSessionResponse.defaultHostingPrecedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence + 69, // 23: ziti.edge_ctrl.pb.CreateApiSessionResponse.servicePrecedences:type_name -> ziti.edge_ctrl.pb.CreateApiSessionResponse.ServicePrecedencesEntry + 70, // 24: ziti.edge_ctrl.pb.CreateApiSessionResponse.serviceCosts:type_name -> ziti.edge_ctrl.pb.CreateApiSessionResponse.ServiceCostsEntry + 71, // 25: ziti.edge_ctrl.pb.CreateCircuitForServiceRequest.peerData:type_name -> ziti.edge_ctrl.pb.CreateCircuitForServiceRequest.PeerDataEntry + 35, // 26: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.apiSession:type_name -> ziti.edge_ctrl.pb.CreateApiSessionResponse + 37, // 27: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.session:type_name -> ziti.edge_ctrl.pb.CreateSessionResponse + 72, // 28: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.peerData:type_name -> ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.PeerDataEntry + 73, // 29: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.tags:type_name -> ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.TagsEntry + 40, // 30: ziti.edge_ctrl.pb.ServicesList.services:type_name -> ziti.edge_ctrl.pb.TunnelService + 74, // 31: ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest.peerData:type_name -> ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest.PeerDataEntry + 3, // 32: ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence + 35, // 33: ziti.edge_ctrl.pb.CreateTunnelTerminatorResponse.apiSession:type_name -> ziti.edge_ctrl.pb.CreateApiSessionResponse + 37, // 34: ziti.edge_ctrl.pb.CreateTunnelTerminatorResponse.session:type_name -> ziti.edge_ctrl.pb.CreateSessionResponse + 3, // 35: ziti.edge_ctrl.pb.UpdateTunnelTerminatorRequest.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence + 75, // 36: ziti.edge_ctrl.pb.DataState.Revocation.ExpiresAt:type_name -> google.protobuf.Timestamp + 5, // 37: ziti.edge_ctrl.pb.DataState.Event.action:type_name -> ziti.edge_ctrl.pb.DataState.Action + 50, // 38: ziti.edge_ctrl.pb.DataState.Event.identity:type_name -> ziti.edge_ctrl.pb.DataState.Identity + 51, // 39: ziti.edge_ctrl.pb.DataState.Event.service:type_name -> ziti.edge_ctrl.pb.DataState.Service + 52, // 40: ziti.edge_ctrl.pb.DataState.Event.servicePolicy:type_name -> ziti.edge_ctrl.pb.DataState.ServicePolicy + 56, // 41: ziti.edge_ctrl.pb.DataState.Event.postureCheck:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck + 55, // 42: ziti.edge_ctrl.pb.DataState.Event.publicKey:type_name -> ziti.edge_ctrl.pb.DataState.PublicKey + 53, // 43: ziti.edge_ctrl.pb.DataState.Event.revocation:type_name -> ziti.edge_ctrl.pb.DataState.Revocation + 6, // 44: ziti.edge_ctrl.pb.DataState.PublicKey.usages:type_name -> ziti.edge_ctrl.pb.DataState.PublicKey.Usage + 7, // 45: ziti.edge_ctrl.pb.DataState.PublicKey.format:type_name -> ziti.edge_ctrl.pb.DataState.PublicKey.Format + 57, // 46: ziti.edge_ctrl.pb.DataState.PostureCheck.mac:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.Mac + 58, // 47: ziti.edge_ctrl.pb.DataState.PostureCheck.mfa:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.Mfa + 60, // 48: ziti.edge_ctrl.pb.DataState.PostureCheck.osList:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.OsList + 61, // 49: ziti.edge_ctrl.pb.DataState.PostureCheck.process:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.Process + 62, // 50: ziti.edge_ctrl.pb.DataState.PostureCheck.processMulti:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.ProcessMulti + 63, // 51: ziti.edge_ctrl.pb.DataState.PostureCheck.domains:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.Domains + 59, // 52: ziti.edge_ctrl.pb.DataState.PostureCheck.OsList.osList:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.Os + 61, // 53: ziti.edge_ctrl.pb.DataState.PostureCheck.ProcessMulti.processes:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.Process + 3, // 54: ziti.edge_ctrl.pb.CreateApiSessionResponse.ServicePrecedencesEntry.value:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence + 55, // [55:55] is the sub-list for method output_type + 55, // [55:55] is the sub-list for method input_type + 55, // [55:55] is the sub-list for extension type_name + 55, // [55:55] is the sub-list for extension extendee + 0, // [0:55] is the sub-list for field type_name } func init() { file_edge_ctrl_proto_init() } @@ -4334,7 +5413,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Config); i { + switch v := v.(*DataState); i { case 0: return &v.state case 1: @@ -4346,7 +5425,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SignerCerts); i { + switch v := v.(*Session); i { case 0: return &v.state case 1: @@ -4358,7 +5437,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Identity); i { + switch v := v.(*ApiSession); i { case 0: return &v.state case 1: @@ -4370,7 +5449,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostureSet); i { + switch v := v.(*ApiSessionAdded); i { case 0: return &v.state case 1: @@ -4382,7 +5461,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostureCheck); i { + switch v := v.(*ApiSessionUpdated); i { case 0: return &v.state case 1: @@ -4394,7 +5473,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Session); i { + switch v := v.(*ApiSessionRemoved); i { case 0: return &v.state case 1: @@ -4406,7 +5485,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApiSession); i { + switch v := v.(*ApiSessionHeartbeat); i { case 0: return &v.state case 1: @@ -4418,7 +5497,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApiSessionAdded); i { + switch v := v.(*SessionRemoved); i { case 0: return &v.state case 1: @@ -4430,7 +5509,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApiSessionUpdated); i { + switch v := v.(*RequestClientReSync); i { case 0: return &v.state case 1: @@ -4442,7 +5521,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApiSessionRemoved); i { + switch v := v.(*CreateCircuitRequest); i { case 0: return &v.state case 1: @@ -4454,7 +5533,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApiSessionHeartbeat); i { + switch v := v.(*CreateCircuitResponse); i { case 0: return &v.state case 1: @@ -4466,7 +5545,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SessionRemoved); i { + switch v := v.(*CreateTerminatorRequest); i { case 0: return &v.state case 1: @@ -4478,7 +5557,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RequestClientReSync); i { + switch v := v.(*CreateTerminatorV2Request); i { case 0: return &v.state case 1: @@ -4490,7 +5569,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateCircuitRequest); i { + switch v := v.(*CreateTerminatorV2Response); i { case 0: return &v.state case 1: @@ -4502,7 +5581,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateCircuitResponse); i { + switch v := v.(*RemoveTerminatorRequest); i { case 0: return &v.state case 1: @@ -4514,7 +5593,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTerminatorRequest); i { + switch v := v.(*UpdateTerminatorRequest); i { case 0: return &v.state case 1: @@ -4526,7 +5605,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTerminatorV2Request); i { + switch v := v.(*HealthEventRequest); i { case 0: return &v.state case 1: @@ -4538,7 +5617,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTerminatorV2Response); i { + switch v := v.(*ValidateSessionsRequest); i { case 0: return &v.state case 1: @@ -4550,7 +5629,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveTerminatorRequest); i { + switch v := v.(*EnvInfo); i { case 0: return &v.state case 1: @@ -4562,7 +5641,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateTerminatorRequest); i { + switch v := v.(*SdkInfo); i { case 0: return &v.state case 1: @@ -4574,7 +5653,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HealthEventRequest); i { + switch v := v.(*CreateApiSessionRequest); i { case 0: return &v.state case 1: @@ -4586,7 +5665,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateSessionsRequest); i { + switch v := v.(*CreateApiSessionResponse); i { case 0: return &v.state case 1: @@ -4598,7 +5677,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnvInfo); i { + switch v := v.(*CreateCircuitForServiceRequest); i { case 0: return &v.state case 1: @@ -4610,7 +5689,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SdkInfo); i { + switch v := v.(*CreateSessionResponse); i { case 0: return &v.state case 1: @@ -4622,7 +5701,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateApiSessionRequest); i { + switch v := v.(*CreateCircuitForServiceResponse); i { case 0: return &v.state case 1: @@ -4634,7 +5713,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateApiSessionResponse); i { + switch v := v.(*ServicesList); i { case 0: return &v.state case 1: @@ -4646,7 +5725,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateCircuitForServiceRequest); i { + switch v := v.(*TunnelService); i { case 0: return &v.state case 1: @@ -4658,7 +5737,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateSessionResponse); i { + switch v := v.(*CreateTunnelTerminatorRequest); i { case 0: return &v.state case 1: @@ -4670,7 +5749,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateCircuitForServiceResponse); i { + switch v := v.(*CreateTunnelTerminatorResponse); i { case 0: return &v.state case 1: @@ -4682,7 +5761,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServicesList); i { + switch v := v.(*UpdateTunnelTerminatorRequest); i { case 0: return &v.state case 1: @@ -4694,7 +5773,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TunnelService); i { + switch v := v.(*EnrollmentExtendRouterRequest); i { case 0: return &v.state case 1: @@ -4706,7 +5785,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTunnelTerminatorRequest); i { + switch v := v.(*EnrollmentCertsResponse); i { case 0: return &v.state case 1: @@ -4718,7 +5797,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTunnelTerminatorResponse); i { + switch v := v.(*EnrollmentExtendRouterVerifyRequest); i { case 0: return &v.state case 1: @@ -4729,8 +5808,8 @@ func file_edge_ctrl_proto_init() { return nil } } - file_edge_ctrl_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateTunnelTerminatorRequest); i { + file_edge_ctrl_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_Identity); i { case 0: return &v.state case 1: @@ -4741,8 +5820,8 @@ func file_edge_ctrl_proto_init() { return nil } } - file_edge_ctrl_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnrollmentExtendRouterRequest); i { + file_edge_ctrl_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_Service); i { case 0: return &v.state case 1: @@ -4753,8 +5832,8 @@ func file_edge_ctrl_proto_init() { return nil } } - file_edge_ctrl_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnrollmentCertsResponse); i { + file_edge_ctrl_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_ServicePolicy); i { case 0: return &v.state case 1: @@ -4765,8 +5844,128 @@ func file_edge_ctrl_proto_init() { return nil } } - file_edge_ctrl_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnrollmentExtendRouterVerifyRequest); i { + file_edge_ctrl_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_Revocation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_edge_ctrl_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_Event); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_edge_ctrl_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_PublicKey); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_edge_ctrl_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_PostureCheck); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_edge_ctrl_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_PostureCheck_Mac); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_edge_ctrl_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_PostureCheck_Mfa); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_edge_ctrl_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_PostureCheck_Os); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_edge_ctrl_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_PostureCheck_OsList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_edge_ctrl_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_PostureCheck_Process); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_edge_ctrl_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_PostureCheck_ProcessMulti); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_edge_ctrl_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_PostureCheck_Domains); i { case 0: return &v.state case 1: @@ -4778,13 +5977,29 @@ func file_edge_ctrl_proto_init() { } } } + file_edge_ctrl_proto_msgTypes[46].OneofWrappers = []interface{}{ + (*DataState_Event_Identity)(nil), + (*DataState_Event_Service)(nil), + (*DataState_Event_ServicePolicy)(nil), + (*DataState_Event_PostureCheck)(nil), + (*DataState_Event_PublicKey)(nil), + (*DataState_Event_Revocation)(nil), + } + file_edge_ctrl_proto_msgTypes[48].OneofWrappers = []interface{}{ + (*DataState_PostureCheck_Mac_)(nil), + (*DataState_PostureCheck_Mfa_)(nil), + (*DataState_PostureCheck_OsList_)(nil), + (*DataState_PostureCheck_Process_)(nil), + (*DataState_PostureCheck_ProcessMulti_)(nil), + (*DataState_PostureCheck_Domains_)(nil), + } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_edge_ctrl_proto_rawDesc, - NumEnums: 6, - NumMessages: 58, + NumEnums: 8, + NumMessages: 67, NumExtensions: 0, NumServices: 0, }, diff --git a/common/pb/edge_ctrl_pb/edge_ctrl.proto b/common/pb/edge_ctrl_pb/edge_ctrl.proto index 58cbe9b77..c83fa2e1c 100644 --- a/common/pb/edge_ctrl_pb/edge_ctrl.proto +++ b/common/pb/edge_ctrl_pb/edge_ctrl.proto @@ -2,7 +2,9 @@ syntax = "proto3"; package ziti.edge_ctrl.pb; -option go_package = "github.com/openziti/edge/pb/edge_ctrl_pb"; +import "google/protobuf/timestamp.proto"; + +option go_package = "github.com/openziti/ziti/common/pb/edge_ctrl_pb"; enum ContentType { Zero = 0; @@ -27,7 +29,6 @@ enum ContentType { RemoveTerminatorResponseType = 20212; ValidateSessionsRequestType = 20213; HealthEventType = 20214; - SigningCertAddedType = 20215; CreateTerminatorV2RequestType = 20216; CreateTerminatorV2ResponseType = 20217; CreateCircuitV2RequestType = 20218; @@ -54,6 +55,10 @@ enum ContentType { RemoveTunnelTerminatorResponseType = 20411; TunnelHealthEventType = 20412; + + DataStateType = 20500; + DataStateEventType = 20501; + UpdateTokenType = 20502; } enum SessionType { @@ -65,6 +70,8 @@ enum Header { HeaderZero = 0; TerminatorId = 1022; CheckPassed = 1023; + RouterDataModel = 1024; + RouterDataModelIndex = 1025; } message ServerHello { @@ -115,44 +122,124 @@ message Service { bool encryptionRequired = 3; } -enum ConfigType { - Add = 0; - Remove = 1; - Replace = 2; -} - - -message Config { - string syncId = 1; - string id = 2; - ConfigType type = 3; - repeated bytes signerKeys = 4; - repeated Identity identities = 5; - repeated Service services = 6; - repeated PostureSet postureSet = 7; - repeated PostureCheck postureChecks = 8; -} - -message SignerCerts { - repeated bytes keys = 1; -} - -message Identity { - string id = 1; - string name = 2; - repeated string serviceIds = 3; -} - -message PostureSet { - string id = 1; - string name = 2; - repeated string postureCheckIds = 3; -} - -message PostureCheck { - string id = 1; - string type = 2; - map data = 3; +message DataState { + repeated Event events = 1; + uint64 endIndex = 2; + + enum Action { + Create = 0; + Update = 1; + Delete = 2; + } + + message Identity { + string id = 1; + string name = 2; + repeated string servicePolicyIds = 3; + } + + message Service { + string id = 1; + string name = 2; + bool encryptionRequired = 3; + } + + message ServicePolicy { + string id = 1; + string name = 2; + repeated string serviceIds = 3; + repeated string postureCheckIds =4; + repeated string identityIds = 5; + } + + message Revocation { + string id = 1; + google.protobuf.Timestamp ExpiresAt = 2; + } + + message Event { + Action action = 1; + uint64 index = 2; + bool isSynthetic = 3; + + oneof Model{ + Identity identity = 10; + Service service = 11; + ServicePolicy servicePolicy = 12; + PostureCheck postureCheck = 13; + PublicKey publicKey = 14; + Revocation revocation = 15; + } + } + + message PublicKey { + bytes data = 1; //public key + string kid = 2; //key id/fingerprint + repeated Usage usages = 3; // what the public key in data is used for + Format format = 4; //the format of the public key in data and chain + + enum Usage { + JWTValidation = 0; + ClientX509CertValidation = 1; + } + + enum Format { + X509CertDer = 0; //x509 cert + PKIXPublicKey = 1; //asn.1 public key + //JWK = 3; //JSON Web Key + } + } + + message PostureCheck { + message Mac { + repeated string macAddresses = 1; + } + + message Mfa { + int64 TimeoutSeconds = 1; + bool PromptOnWake = 2; + bool PromptOnUnlock = 3; + bool IgnoreLegacyEndpoints = 4; + } + + message Os { + string OsType = 1; + repeated string OsVersions = 2; + } + + message OsList { + repeated Os osList = 1; + } + + message Process { + string OsType = 1; + string Path = 2; + repeated string Hashes = 3; + repeated string Fingerprints = 4; + } + + message ProcessMulti { + string semantic = 1; + repeated Process processes = 2; + } + + message Domains { + repeated string domains = 1; + } + + string id = 1; + string name = 2; + string typeId = 4; + + oneof subtype { + Mac mac = 7; + Mfa mfa = 8; + OsList osList = 9; + Process process = 10; + ProcessMulti processMulti = 11; + Domains domains = 12; + }; + } } message Session { @@ -203,6 +290,7 @@ message CreateCircuitRequest { repeated string fingerprints = 2; string terminatorInstanceId = 3; map peerData = 4; + string apiSessionToken = 5; } message CreateCircuitResponse { @@ -226,6 +314,7 @@ message CreateTerminatorRequest { TerminatorPrecedence precedence = 5; string instanceId = 6; bytes instanceSecret = 7; + string apiSessionToken = 8; } message CreateTerminatorV2Request { @@ -237,6 +326,7 @@ message CreateTerminatorV2Request { TerminatorPrecedence precedence = 6; string instanceId = 7; bytes instanceSecret = 8; + string apiSessionToken = 9; } enum CreateTerminatorResult { @@ -256,6 +346,7 @@ message RemoveTerminatorRequest { string sessionToken = 1; repeated string fingerprints = 2; string terminatorId = 3; + string apiSessionToken = 4; } message UpdateTerminatorRequest { @@ -266,6 +357,7 @@ message UpdateTerminatorRequest { TerminatorPrecedence precedence = 5; bool updatePrecedence = 6; bool updateCost = 7; + string apiSessionToken = 8; } message HealthEventRequest { @@ -273,6 +365,7 @@ message HealthEventRequest { repeated string fingerprints = 2; string terminatorId = 3; bool checkPassed = 4; + string apiSessionToken = 5; } message ValidateSessionsRequest { diff --git a/common/pb/edge_ctrl_pb/headers.go b/common/pb/edge_ctrl_pb/headers.go deleted file mode 100644 index 64d4a118a..000000000 --- a/common/pb/edge_ctrl_pb/headers.go +++ /dev/null @@ -1,3 +0,0 @@ -package edge_ctrl_pb - -const SignerPublicCertsHeader = "signerPublicKeys" diff --git a/common/router_data_model.go b/common/router_data_model.go new file mode 100644 index 000000000..bac068f5d --- /dev/null +++ b/common/router_data_model.go @@ -0,0 +1,586 @@ +package common + +import ( + "compress/gzip" + "encoding/json" + "fmt" + "github.com/michaelquigley/pfxlog" + "github.com/openziti/foundation/v2/stringz" + "github.com/openziti/ziti/common/pb/edge_ctrl_pb" + cmap "github.com/orcaman/concurrent-map/v2" + "io" + "os" +) + +// AccessPolicies represents the Identity's access to a Service through many Policies. The PostureChecks provided +// are referenced by the granting Policies. The PostureChecks for each of the Policies may be evaluated to determine +// a valid policy and posture access path. +type AccessPolicies struct { + Identity *edge_ctrl_pb.DataState_Identity + Service *edge_ctrl_pb.DataState_Service + Policies []*edge_ctrl_pb.DataState_ServicePolicy + PostureChecks map[string]*edge_ctrl_pb.DataState_PostureCheck +} + +// RouterDataModel represents a sub-set of a controller's data model. Enough to validate an identities access to dial/bind +// a service through policies and posture checks. RouterDataModel can operate in two modes: sender (controller) and +// receiver (router). Sender mode allows a controller support an event cache that supports replays for routers connecting +// for the first time/after disconnects. Receive mode does not maintain an event cache and does not support replays. +// It instead is used as a reference data structure for authorization computations. +type RouterDataModel struct { + EventCache + listeners map[chan *edge_ctrl_pb.DataState_Event]struct{} + + Identities cmap.ConcurrentMap[string, *edge_ctrl_pb.DataState_Identity] `json:"identities"` + Services cmap.ConcurrentMap[string, *edge_ctrl_pb.DataState_Service] `json:"services"` + ServicePolicies cmap.ConcurrentMap[string, *edge_ctrl_pb.DataState_ServicePolicy] `json:"servicePolicies"` + PostureChecks cmap.ConcurrentMap[string, *edge_ctrl_pb.DataState_PostureCheck] `json:"postureChecks"` + PublicKeys cmap.ConcurrentMap[string, *edge_ctrl_pb.DataState_PublicKey] `json:"publicKeys"` + Revocations cmap.ConcurrentMap[string, *edge_ctrl_pb.DataState_Revocation] `json:"revocations"` + + listenerBufferSize uint + lastSaveIndex *uint64 +} + +// NewSenderRouterDataModel creates a new RouterDataModel that will store events in a circular buffer of +// logSize. listenerBufferSize affects the buffer size of channels returned to listeners of the data model. +func NewSenderRouterDataModel(logSize uint64, listenerBufferSize uint) *RouterDataModel { + return &RouterDataModel{ + EventCache: NewLoggingEventCache(logSize), + Identities: cmap.New[*edge_ctrl_pb.DataState_Identity](), + Services: cmap.New[*edge_ctrl_pb.DataState_Service](), + ServicePolicies: cmap.New[*edge_ctrl_pb.DataState_ServicePolicy](), + PostureChecks: cmap.New[*edge_ctrl_pb.DataState_PostureCheck](), + PublicKeys: cmap.New[*edge_ctrl_pb.DataState_PublicKey](), + Revocations: cmap.New[*edge_ctrl_pb.DataState_Revocation](), + listenerBufferSize: listenerBufferSize, + } +} + +// NewReceiverRouterDataModel creates a new RouterDataModel that does not store events. listenerBufferSize affects the +// buffer size of channels returned to listeners of the data model. +func NewReceiverRouterDataModel(listenerBufferSize uint) *RouterDataModel { + return &RouterDataModel{ + EventCache: NewForgetfulEventCache(), + Identities: cmap.New[*edge_ctrl_pb.DataState_Identity](), + Services: cmap.New[*edge_ctrl_pb.DataState_Service](), + ServicePolicies: cmap.New[*edge_ctrl_pb.DataState_ServicePolicy](), + PostureChecks: cmap.New[*edge_ctrl_pb.DataState_PostureCheck](), + PublicKeys: cmap.New[*edge_ctrl_pb.DataState_PublicKey](), + Revocations: cmap.New[*edge_ctrl_pb.DataState_Revocation](), + listenerBufferSize: listenerBufferSize, + } +} + +// NewReceiverRouterDataModelFromFile creates a new RouterDataModel that does not store events and is initialized from +// a file backup. listenerBufferSize affects the buffer size of channels returned to listeners of the data model. +func NewReceiverRouterDataModelFromFile(path string, listenerBufferSize uint) (*RouterDataModel, error) { + file, err := os.Open(path) + if err != nil { + return nil, err + } + defer func() { _ = file.Close() }() + + gz, err := gzip.NewReader(file) + if err != nil { + return nil, err + } + defer func() { _ = gz.Close() }() + + data, err := io.ReadAll(gz) + if err != nil { + return nil, err + } + + rdmContents := &rdmDb{ + RouterDataModel: NewReceiverRouterDataModel(listenerBufferSize), + } + + err = json.Unmarshal(data, rdmContents) + if err != nil { + return nil, err + } + + rdmContents.RouterDataModel.lastSaveIndex = &rdmContents.Index + + return rdmContents.RouterDataModel, nil +} + +// NewListener returns a channel that will receive the events applied to this data model. +func (rdm *RouterDataModel) NewListener() <-chan *edge_ctrl_pb.DataState_Event { + if rdm.listeners == nil { + rdm.listeners = map[chan *edge_ctrl_pb.DataState_Event]struct{}{} + } + + newCh := make(chan *edge_ctrl_pb.DataState_Event, rdm.listenerBufferSize) + rdm.listeners[newCh] = struct{}{} + + return newCh +} + +func (rdm *RouterDataModel) sendEvent(event *edge_ctrl_pb.DataState_Event) { + for listener := range rdm.listeners { + listener <- event + } +} + +// Apply applies the given even to the router data model. +func (rdm *RouterDataModel) Apply(event *edge_ctrl_pb.DataState_Event) { + switch typedModel := event.Model.(type) { + case *edge_ctrl_pb.DataState_Event_Identity: + rdm.ApplyIdentityEvent(event, typedModel) + case *edge_ctrl_pb.DataState_Event_Service: + rdm.ApplyServiceEvent(event, typedModel) + case *edge_ctrl_pb.DataState_Event_ServicePolicy: + rdm.ApplyServicePolicyEvent(event, typedModel) + case *edge_ctrl_pb.DataState_Event_PostureCheck: + rdm.ApplyPostureCheckEvent(event, typedModel) + case *edge_ctrl_pb.DataState_Event_PublicKey: + rdm.ApplyPublicKeyEvent(event, typedModel) + case *edge_ctrl_pb.DataState_Event_Revocation: + rdm.ApplyRevocationEvent(event, typedModel) + } +} + +func (rdm *RouterDataModel) Handle(event *edge_ctrl_pb.DataState_Event) { + switch typedModel := event.Model.(type) { + case *edge_ctrl_pb.DataState_Event_Identity: + rdm.HandleIdentityEvent(event, typedModel) + case *edge_ctrl_pb.DataState_Event_Service: + rdm.HandleServiceEvent(event, typedModel) + case *edge_ctrl_pb.DataState_Event_ServicePolicy: + rdm.HandleServicePolicyEvent(event, typedModel) + case *edge_ctrl_pb.DataState_Event_PostureCheck: + rdm.HandlePostureCheckEvent(event, typedModel) + case *edge_ctrl_pb.DataState_Event_PublicKey: + rdm.HandlePublicKeyEvent(event, typedModel) + case *edge_ctrl_pb.DataState_Event_Revocation: + rdm.HandleRevocationEvent(event, typedModel) + } +} + +// HandleIdentityEvent will apply the delta event to the router data model. It is not restricted by index calculations. +// Use ApplyIdentityEvent for event logged event handling. This method is generally meant for bulk loading of data +// during startup. +func (rdm *RouterDataModel) HandleIdentityEvent(event *edge_ctrl_pb.DataState_Event, model *edge_ctrl_pb.DataState_Event_Identity) { + if event.Action == edge_ctrl_pb.DataState_Delete { + rdm.Identities.Remove(model.Identity.Id) + + rdm.ServicePolicies.IterCb(func(servicePolicyId string, servicePolicy *edge_ctrl_pb.DataState_ServicePolicy) { + servicePolicy.IdentityIds = stringz.Remove(servicePolicy.IdentityIds, model.Identity.Id) + }) + } else { + rdm.Identities.Upsert(model.Identity.Id, nil, func(exist bool, valueInMap *edge_ctrl_pb.DataState_Identity, newValue *edge_ctrl_pb.DataState_Identity) *edge_ctrl_pb.DataState_Identity { + if !exist { + return model.Identity + } + + valueInMap.Name = model.Identity.Name + + return valueInMap + }) + } +} + +func (rdm *RouterDataModel) ApplyIdentityEvent(event *edge_ctrl_pb.DataState_Event, model *edge_ctrl_pb.DataState_Event_Identity) { + err := rdm.EventCache.Store(event, func(index uint64, event *edge_ctrl_pb.DataState_Event) { + rdm.HandleIdentityEvent(event, model) + }) + + if err != nil { + pfxlog.Logger().WithError(err). + WithFields(map[string]interface{}{ + "event": event, + }). + Error("could not store identity event") + return + } + + rdm.sendEvent(event) +} + +// HandleServiceEvent will apply the delta event to the router data model. It is not restricted by index calculations. +// Use ApplyServiceEvent for event logged event handling. This method is generally meant for bulk loading of data +// during startup. +func (rdm *RouterDataModel) HandleServiceEvent(event *edge_ctrl_pb.DataState_Event, model *edge_ctrl_pb.DataState_Event_Service) { + if event.Action == edge_ctrl_pb.DataState_Delete { + rdm.Services.Remove(model.Service.Id) + } else { + rdm.Services.Set(model.Service.Id, model.Service) + } +} + +func (rdm *RouterDataModel) ApplyServiceEvent(event *edge_ctrl_pb.DataState_Event, model *edge_ctrl_pb.DataState_Event_Service) { + err := rdm.EventCache.Store(event, func(index uint64, event *edge_ctrl_pb.DataState_Event) { + rdm.HandleServiceEvent(event, model) + }) + + if err != nil { + pfxlog.Logger().WithError(err). + WithFields(map[string]interface{}{ + "event": event, + }). + Error("could not store service event") + return + } + + rdm.sendEvent(event) +} + +func (rdm *RouterDataModel) applyCreateServicePolicyEvent(_ *edge_ctrl_pb.DataState_Event, model *edge_ctrl_pb.DataState_Event_ServicePolicy) { + servicePolicy := model.ServicePolicy + rdm.ServicePolicies.Set(servicePolicy.Id, servicePolicy) + + for _, identityId := range servicePolicy.IdentityIds { + rdm.Identities.Upsert(identityId, nil, func(exist bool, valueInMap *edge_ctrl_pb.DataState_Identity, newValue *edge_ctrl_pb.DataState_Identity) *edge_ctrl_pb.DataState_Identity { + if !exist { + return &edge_ctrl_pb.DataState_Identity{ + Id: identityId, + Name: "UNKNOWN", + ServicePolicyIds: []string{servicePolicy.Id}, + } + } + + if !stringz.Contains(valueInMap.ServicePolicyIds, servicePolicy.Id) { + valueInMap.ServicePolicyIds = append(valueInMap.ServicePolicyIds, servicePolicy.Id) + } + + return valueInMap + }) + } +} + +func (rdm *RouterDataModel) applyUpdateServicePolicyEvent(event *edge_ctrl_pb.DataState_Event, model *edge_ctrl_pb.DataState_Event_ServicePolicy) { + oldPolicy, ok := rdm.ServicePolicies.Get(model.ServicePolicy.Id) + + if !ok { + rdm.applyCreateServicePolicyEvent(event, model) + return + } + + removeFromIdentities := stringz.Difference(oldPolicy.IdentityIds, model.ServicePolicy.IdentityIds) + addToIdentities := stringz.Difference(model.ServicePolicy.IdentityIds, oldPolicy.IdentityIds) + + for _, identityId := range removeFromIdentities { + rdm.Identities.Upsert(identityId, nil, func(exist bool, valueInMap *edge_ctrl_pb.DataState_Identity, newValue *edge_ctrl_pb.DataState_Identity) *edge_ctrl_pb.DataState_Identity { + if !exist { + return &edge_ctrl_pb.DataState_Identity{ + Id: identityId, + } + } + valueInMap.ServicePolicyIds = stringz.Remove(valueInMap.ServicePolicyIds, model.ServicePolicy.Id) + + return valueInMap + }) + } + + for _, identityId := range addToIdentities { + rdm.Identities.Upsert(identityId, nil, func(exist bool, valueInMap *edge_ctrl_pb.DataState_Identity, newValue *edge_ctrl_pb.DataState_Identity) *edge_ctrl_pb.DataState_Identity { + if !exist { + return &edge_ctrl_pb.DataState_Identity{ + Id: identityId, + ServicePolicyIds: []string{model.ServicePolicy.Id}, + } + } + + if !stringz.Contains(valueInMap.ServicePolicyIds, model.ServicePolicy.Id) { + valueInMap.ServicePolicyIds = append(valueInMap.ServicePolicyIds, model.ServicePolicy.Id) + } + + return valueInMap + }) + } +} + +func (rdm *RouterDataModel) applyDeleteServicePolicyEvent(_ *edge_ctrl_pb.DataState_Event, model *edge_ctrl_pb.DataState_Event_ServicePolicy) { + for _, identityId := range model.ServicePolicy.IdentityIds { + if identity, ok := rdm.Identities.Get(identityId); ok { + identity.ServicePolicyIds = stringz.Remove(identity.ServicePolicyIds, model.ServicePolicy.Id) + } + } + + rdm.ServicePolicies.Remove(model.ServicePolicy.Id) +} + +// HandleServicePolicyEvent will apply the delta event to the router data model. It is not restricted by index calculations. +// Use ApplyServicePolicyEvent for event logged event handling. This method is generally meant for bulk loading of data +// during startup. +func (rdm *RouterDataModel) HandleServicePolicyEvent(event *edge_ctrl_pb.DataState_Event, model *edge_ctrl_pb.DataState_Event_ServicePolicy) { + switch event.Action { + case edge_ctrl_pb.DataState_Create: + rdm.applyCreateServicePolicyEvent(event, model) + case edge_ctrl_pb.DataState_Update: + rdm.applyUpdateServicePolicyEvent(event, model) + case edge_ctrl_pb.DataState_Delete: + rdm.applyDeleteServicePolicyEvent(event, model) + } +} + +func (rdm *RouterDataModel) ApplyServicePolicyEvent(event *edge_ctrl_pb.DataState_Event, model *edge_ctrl_pb.DataState_Event_ServicePolicy) { + err := rdm.EventCache.Store(event, func(index uint64, event *edge_ctrl_pb.DataState_Event) { + rdm.HandleServicePolicyEvent(event, model) + }) + + if err != nil { + pfxlog.Logger().WithError(err). + WithFields(map[string]interface{}{ + "event": event, + }). + Error("could not store service policy event") + return + } + + rdm.sendEvent(event) +} + +// HandlePostureCheckEvent will apply the delta event to the router data model. It is not restricted by index calculations. +// Use ApplyPostureCheckEvent for event logged event handling. This method is generally meant for bulk loading of data +// during startup. +func (rdm *RouterDataModel) HandlePostureCheckEvent(event *edge_ctrl_pb.DataState_Event, model *edge_ctrl_pb.DataState_Event_PostureCheck) { + if event.Action == edge_ctrl_pb.DataState_Delete { + rdm.PostureChecks.Remove(model.PostureCheck.Id) + } else { + rdm.PostureChecks.Set(model.PostureCheck.Id, model.PostureCheck) + } +} + +func (rdm *RouterDataModel) ApplyPostureCheckEvent(event *edge_ctrl_pb.DataState_Event, model *edge_ctrl_pb.DataState_Event_PostureCheck) { + err := rdm.EventCache.Store(event, func(index uint64, event *edge_ctrl_pb.DataState_Event) { + rdm.HandlePostureCheckEvent(event, model) + }) + + if err != nil { + pfxlog.Logger().WithError(err). + WithFields(map[string]interface{}{ + "event": event, + }). + Error("could not store posture check event") + return + } + + rdm.sendEvent(event) +} + +// HandlePublicKeyEvent will apply the delta event to the router data model. It is not restricted by index calculations. +// Use ApplyPublicKeyEvent for event logged event handling. This method is generally meant for bulk loading of data +// during startup. +func (rdm *RouterDataModel) HandlePublicKeyEvent(event *edge_ctrl_pb.DataState_Event, model *edge_ctrl_pb.DataState_Event_PublicKey) { + if event.Action == edge_ctrl_pb.DataState_Delete { + rdm.PublicKeys.Remove(model.PublicKey.Kid) + } else { + rdm.PublicKeys.Set(model.PublicKey.Kid, model.PublicKey) + } +} + +func (rdm *RouterDataModel) ApplyPublicKeyEvent(event *edge_ctrl_pb.DataState_Event, model *edge_ctrl_pb.DataState_Event_PublicKey) { + err := rdm.EventCache.Store(event, func(index uint64, event *edge_ctrl_pb.DataState_Event) { + rdm.HandlePublicKeyEvent(event, model) + }) + + if err != nil { + pfxlog.Logger().WithError(err). + WithFields(map[string]interface{}{ + "event": event, + }). + Error("could not store public key event") + return + } + + rdm.sendEvent(event) +} + +// HandleRevocationEvent will apply the delta event to the router data model. It is not restricted by index calculations. +// Use ApplyRevocationEvent for event logged event handling. This method is generally meant for bulk loading of data +// during startup. +func (rdm *RouterDataModel) HandleRevocationEvent(event *edge_ctrl_pb.DataState_Event, model *edge_ctrl_pb.DataState_Event_Revocation) { + if event.Action == edge_ctrl_pb.DataState_Delete { + rdm.Revocations.Remove(model.Revocation.Id) + } else { + rdm.Revocations.Set(model.Revocation.Id, model.Revocation) + } +} + +func (rdm *RouterDataModel) ApplyRevocationEvent(event *edge_ctrl_pb.DataState_Event, model *edge_ctrl_pb.DataState_Event_Revocation) { + err := rdm.EventCache.Store(event, func(index uint64, event *edge_ctrl_pb.DataState_Event) { + rdm.HandleRevocationEvent(event, model) + }) + + if err != nil { + pfxlog.Logger().WithError(err). + WithFields(map[string]interface{}{ + "event": event, + }). + Error("could not store revocation event") + return + } + + rdm.sendEvent(event) +} + +func (rdm *RouterDataModel) GetDataState() *edge_ctrl_pb.DataState { + var events []*edge_ctrl_pb.DataState_Event + + rdm.EventCache.WhileLocked(func(_ uint64, _ bool) { + identityBuffer := rdm.Identities.IterBuffered() + serviceBuffer := rdm.Services.IterBuffered() + ServicePoliciesBuffer := rdm.ServicePolicies.IterBuffered() + postureCheckBuffer := rdm.PostureChecks.IterBuffered() + publicKeysBuffer := rdm.PublicKeys.IterBuffered() + + for entry := range identityBuffer { + newEvent := &edge_ctrl_pb.DataState_Event{ + Action: edge_ctrl_pb.DataState_Create, + Model: &edge_ctrl_pb.DataState_Event_Identity{ + Identity: entry.Val, + }, + } + events = append(events, newEvent) + } + + for entry := range serviceBuffer { + newEvent := &edge_ctrl_pb.DataState_Event{ + Action: edge_ctrl_pb.DataState_Create, + Model: &edge_ctrl_pb.DataState_Event_Service{ + Service: entry.Val, + }, + } + events = append(events, newEvent) + } + + for entry := range postureCheckBuffer { + newEvent := &edge_ctrl_pb.DataState_Event{ + Action: edge_ctrl_pb.DataState_Create, + Model: &edge_ctrl_pb.DataState_Event_PostureCheck{ + PostureCheck: entry.Val, + }, + } + events = append(events, newEvent) + } + + for entry := range ServicePoliciesBuffer { + newEvent := &edge_ctrl_pb.DataState_Event{ + Action: edge_ctrl_pb.DataState_Create, + Model: &edge_ctrl_pb.DataState_Event_ServicePolicy{ + ServicePolicy: entry.Val, + }, + } + events = append(events, newEvent) + } + + for entry := range publicKeysBuffer { + newEvent := &edge_ctrl_pb.DataState_Event{ + Action: edge_ctrl_pb.DataState_Create, + Model: &edge_ctrl_pb.DataState_Event_PublicKey{ + PublicKey: entry.Val, + }, + } + events = append(events, newEvent) + } + }) + + return &edge_ctrl_pb.DataState{ + Events: events, + } +} + +// rdmDb is a helper structure of serializing router data models to JSON gzipped files. +type rdmDb struct { + RouterDataModel *RouterDataModel `json:"model"` + Index uint64 `json:"index"` +} + +func (rdm *RouterDataModel) Save(path string) { + rdm.EventCache.WhileLocked(func(index uint64, indexInitialized bool) { + if !indexInitialized { + pfxlog.Logger().Debug("could not save router data model, no index") + return + } + + //nothing to save + if rdm.lastSaveIndex != nil && *rdm.lastSaveIndex == index { + pfxlog.Logger().Debug("no changes to router model, nothing to save") + return + } + + rdm.lastSaveIndex = &index + + rdmFile := rdmDb{ + RouterDataModel: rdm, + Index: index, + } + + jsonBytes, err := json.Marshal(rdmFile) + + if err != nil { + pfxlog.Logger().WithError(err).Error("could not marshal router data model") + return + } + + // Create a new gzip file + file, err := os.Create(path) + if err != nil { + pfxlog.Logger().WithError(err).Error("could not marshal router data model, could not create file") + return + } + defer func() { _ = file.Close() }() + + // Create a gzip writer + gz := gzip.NewWriter(file) + defer func() { _ = gz.Close() }() + + // Write the gzipped JSON data to the file + _, err = gz.Write(jsonBytes) + + if err != nil { + pfxlog.Logger().WithError(err).Error("could not marshal router data model, could not compress and write") + return + } + }) +} + +// GetServiceAccessPolicies returns an AccessPolicies instance for an identity attempting to access a service. +func (rdm *RouterDataModel) GetServiceAccessPolicies(identityId string, serviceId string) (*AccessPolicies, error) { + identity, ok := rdm.Identities.Get(identityId) + + if !ok { + return nil, fmt.Errorf("identity not foud by id") + } + + service, ok := rdm.Services.Get(serviceId) + + if !ok { + return nil, fmt.Errorf("service not found by id") + } + + var policies []*edge_ctrl_pb.DataState_ServicePolicy + + postureChecks := map[string]*edge_ctrl_pb.DataState_PostureCheck{} + + for _, servicePolicyId := range identity.ServicePolicyIds { + servicePolicy, ok := rdm.ServicePolicies.Get(servicePolicyId) + + if !ok { + continue + } + + if stringz.Contains(servicePolicy.IdentityIds, identityId) { + policies = append(policies, servicePolicy) + + for _, postureCheckId := range servicePolicy.PostureCheckIds { + if _, ok := postureChecks[postureCheckId]; !ok { + //ignore ok, if !ok postureCheck == nil which will trigger + //failure during evaluation + postureCheck, _ := rdm.PostureChecks.Get(postureCheckId) + postureChecks[postureCheckId] = postureCheck + } + } + } + } + + return &AccessPolicies{ + Identity: identity, + Service: service, + Policies: policies, + PostureChecks: postureChecks, + }, nil +} diff --git a/common/version/info_generated.go b/common/version/info_generated.go index 0f07fb2ab..bb6b6fbc2 100644 --- a/common/version/info_generated.go +++ b/common/version/info_generated.go @@ -2,7 +2,7 @@ package version -const ( +var ( Version = "v0.0.0" Revision = "local" Branch = "local" diff --git a/controller/apierror/helpers.go b/controller/apierror/helpers.go index 475733ca6..2e16b132a 100644 --- a/controller/apierror/helpers.go +++ b/controller/apierror/helpers.go @@ -304,6 +304,14 @@ func NewMfaExistsError() *errorz.ApiError { } } +func NewMfaEnrollmentNotStarted() *errorz.ApiError { + return &errorz.ApiError{ + Code: MfaEnrollmentNotStartedCode, + Message: MfaEnrollmentNotStartedMessage, + Status: MfaEnrollmentNotStartedStatus, + } +} + func NewMfaNotEnrolledError() *errorz.ApiError { return &errorz.ApiError{ Code: MfaNotEnrolledCode, diff --git a/controller/apierror/messages.go b/controller/apierror/messages.go index b4b69b695..932eafbd5 100644 --- a/controller/apierror/messages.go +++ b/controller/apierror/messages.go @@ -154,6 +154,10 @@ const ( MfaExistsMessage string = "An MFA record already exists, try removing it" MfaExistsStatus int = http.StatusConflict + MfaEnrollmentNotStartedCode = "MFA_ENROLLMENT_NOT_STARTED" + MfaEnrollmentNotStartedMessage = "MFA enrollment has not be started" + MfaEnrollmentNotStartedStatus = http.StatusNotFound + /* #nosec */ MfaInvalidTokenCode string = "MFA_INVALID_TOKEN" MfaInvalidTokenMessage string = "An invalid token/code was provided" diff --git a/controller/config/config.go b/controller/config/config.go index be1e92368..b5c91470c 100644 --- a/controller/config/config.go +++ b/controller/config/config.go @@ -508,7 +508,7 @@ func CalculateCaPems(caPems *bytes.Buffer) *bytes.Buffer { if block.Type != "CERTIFICATE" { pfxlog.Logger(). WithField("type", block.Type). - WithField("block", pem.EncodeToMemory(block)). + WithField("block", string(pem.EncodeToMemory(block))). Warn("encountered an invalid PEM block type loading configured CAs, block will be ignored") continue } @@ -518,7 +518,7 @@ func CalculateCaPems(caPems *bytes.Buffer) *bytes.Buffer { if err != nil { pfxlog.Logger(). WithField("type", block.Type). - WithField("block", pem.EncodeToMemory(block)). + WithField("block", string(pem.EncodeToMemory(block))). WithError(err). Warn("block could not be parsed as a certificate, block will be ignored") continue @@ -527,7 +527,7 @@ func CalculateCaPems(caPems *bytes.Buffer) *bytes.Buffer { if !cert.IsCA { pfxlog.Logger(). WithField("type", block.Type). - WithField("block", pem.EncodeToMemory(block)). + WithField("block", string(pem.EncodeToMemory(block))). Warn("block is not a CA, block will be ignored") continue } diff --git a/controller/controller.go b/controller/controller.go index 8b9058800..bba2aecf9 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -100,6 +100,21 @@ func (c *Controller) GetPeerSigners() []*x509.Certificate { return certs } +func (c *Controller) GetPeerAddresses() []string { + if c.raftController == nil || c.raftController.Mesh == nil { + return nil + } + + var addresses []string + + for _, peer := range c.raftController.Mesh.GetPeers() { + addresses = append(addresses, peer.Address) + } + + return addresses + +} + func (c *Controller) GetId() *identity.TokenId { return c.config.Id } @@ -132,6 +147,12 @@ func (c *Controller) IsRaftEnabled() bool { return c.raftController != nil } +func (c *Controller) IsRaftLeader() bool { return c.raftController.IsLeader() } + +func (c *Controller) GetRaftIndex() uint64 { + return c.raftController.Raft.LastIndex() +} + func (c *Controller) GetDb() boltz.Db { return c.config.Db } diff --git a/controller/db/base_entity.go b/controller/db/base_entity.go index 0af89eda9..ed1101a42 100644 --- a/controller/db/base_entity.go +++ b/controller/db/base_entity.go @@ -29,6 +29,7 @@ const ( EntityTypeCas = "cas" EntityTypeConfigs = "configs" EntityTypeConfigTypes = "configTypes" + EntityTypeControllers = "controllers" EntityTypeEdgeRouterPolicies = "edgeRouterPolicies" EntityTypeExternalJwtSigners = "externalJwtSigners" EntityTypeIdentities = "identities" diff --git a/controller/db/controller_store.go b/controller/db/controller_store.go new file mode 100644 index 000000000..c0d64bd7e --- /dev/null +++ b/controller/db/controller_store.go @@ -0,0 +1,109 @@ +/* + Copyright NetFoundry Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package db + +import ( + "github.com/openziti/storage/ast" + "github.com/openziti/storage/boltz" + "time" +) + +const ( + FieldControllerAddress = "address" + FieldControllerCertPem = "certPem" + FieldControllerFingerprint = "fingerprint" + FieldControllerIsOnline = "isOnline" + FieldControllerLastJoinedAt = "lastJoinedAt" +) + +type Controller struct { + boltz.BaseExtEntity + Name string `json:"name"` + Address string `json:"address"` + CertPem string `json:"certPem"` + Fingerprint string `json:"fingerprint"` + IsOnline bool `json:"isOnline"` + LastJoinedAt *time.Time `json:"lastJoinedAt"` +} + +func (entity *Controller) GetName() string { + return entity.Name +} + +func (entity *Controller) GetEntityType() string { + return EntityTypeCas +} + +var _ ControllerStore = (*controllerStoreImpl)(nil) + +type ControllerStore interface { + Store[*Controller] + GetNameIndex() boltz.ReadIndex +} + +func newControllerStore(stores *stores) *controllerStoreImpl { + store := &controllerStoreImpl{} + store.baseStore = newBaseStore[*Controller](stores, store) + store.InitImpl(store) + return store +} + +type controllerStoreImpl struct { + *baseStore[*Controller] + indexName boltz.ReadIndex +} + +func (store *controllerStoreImpl) GetNameIndex() boltz.ReadIndex { + return store.indexName +} + +func (store *controllerStoreImpl) initializeLocal() { + store.AddExtEntitySymbols() + store.indexName = store.addUniqueNameField() + + store.AddSymbol(FieldControllerAddress, ast.NodeTypeString) + store.AddSymbol(FieldControllerCertPem, ast.NodeTypeString) + store.AddSymbol(FieldControllerFingerprint, ast.NodeTypeString) + store.AddSymbol(FieldControllerIsOnline, ast.NodeTypeBool) + store.AddSymbol(FieldControllerLastJoinedAt, ast.NodeTypeDatetime) +} + +func (store *controllerStoreImpl) initializeLinked() {} + +func (store *controllerStoreImpl) NewEntity() *Controller { + return &Controller{} +} + +func (store *controllerStoreImpl) FillEntity(entity *Controller, bucket *boltz.TypedBucket) { + entity.LoadBaseValues(bucket) + entity.Name = bucket.GetStringOrError(FieldName) + entity.Address = bucket.GetStringWithDefault(FieldControllerAddress, "") + entity.CertPem = bucket.GetStringOrError(FieldControllerCertPem) + entity.Fingerprint = bucket.GetStringOrError(FieldControllerFingerprint) + entity.IsOnline = bucket.GetBoolWithDefault(FieldControllerIsOnline, false) + entity.LastJoinedAt = bucket.GetTime(FieldControllerLastJoinedAt) +} + +func (store *controllerStoreImpl) PersistEntity(entity *Controller, ctx *boltz.PersistContext) { + entity.SetBaseValues(ctx) + ctx.SetString(FieldName, entity.Name) + ctx.SetString(FieldControllerAddress, entity.Address) + ctx.SetString(FieldControllerCertPem, entity.CertPem) + ctx.SetString(FieldControllerFingerprint, entity.Fingerprint) + ctx.SetBool(FieldControllerIsOnline, entity.IsOnline) + ctx.SetTimeP(FieldControllerLastJoinedAt, entity.LastJoinedAt) +} diff --git a/controller/db/stores.go b/controller/db/stores.go index 89b67ec31..0b24e393d 100644 --- a/controller/db/stores.go +++ b/controller/db/stores.go @@ -102,6 +102,7 @@ type Stores struct { Ca CaStore Config ConfigStore ConfigType ConfigTypeStore + Controller ControllerStore EdgeRouter EdgeRouterStore EdgeRouterPolicy EdgeRouterPolicyStore EdgeService EdgeServiceStore @@ -202,6 +203,7 @@ type stores struct { ca *caStoreImpl config *configStoreImpl configType *configTypeStoreImpl + controller *controllerStoreImpl edgeRouter *edgeRouterStoreImpl edgeRouterPolicy *edgeRouterPolicyStoreImpl edgeService *edgeServiceStoreImpl @@ -253,6 +255,7 @@ func InitStores(db boltz.Db) (*Stores, error) { internalStores.ca = newCaStore(internalStores) internalStores.config = newConfigsStore(internalStores) internalStores.configType = newConfigTypesStore(internalStores) + internalStores.controller = newControllerStore(internalStores) internalStores.edgeRouter = newEdgeRouterStore(internalStores) internalStores.edgeRouterPolicy = newEdgeRouterPolicyStore(internalStores) internalStores.edgeService = newEdgeServiceStore(internalStores) @@ -283,6 +286,7 @@ func InitStores(db boltz.Db) (*Stores, error) { Ca: internalStores.ca, Config: internalStores.config, ConfigType: internalStores.configType, + Controller: internalStores.controller, EdgeRouter: internalStores.edgeRouter, EdgeRouterPolicy: internalStores.edgeRouterPolicy, EdgeService: internalStores.edgeService, diff --git a/controller/env/appenv.go b/controller/env/appenv.go index c4e5bd314..5a3947f63 100644 --- a/controller/env/appenv.go +++ b/controller/env/appenv.go @@ -45,11 +45,12 @@ import ( "github.com/openziti/sdk-golang/ziti" "github.com/openziti/storage/boltz" "github.com/openziti/xweb/v2" + "github.com/openziti/ziti/common" "github.com/openziti/ziti/common/cert" "github.com/openziti/ziti/common/eid" "github.com/openziti/ziti/controller/api" "github.com/openziti/ziti/controller/command" - edgeConfig "github.com/openziti/ziti/controller/config" + "github.com/openziti/ziti/controller/config" "github.com/openziti/ziti/controller/db" "github.com/openziti/ziti/controller/event" "github.com/openziti/ziti/controller/events" @@ -58,7 +59,6 @@ import ( "github.com/openziti/ziti/controller/model" "github.com/openziti/ziti/controller/models" "github.com/openziti/ziti/controller/network" - "github.com/openziti/ziti/controller/oidc_auth" "github.com/openziti/ziti/controller/response" "github.com/openziti/ziti/controller/xctrl" "github.com/openziti/ziti/controller/xmgmt" @@ -82,8 +82,9 @@ const ( ) type AppEnv struct { - Managers *model.Managers - Config *edgeConfig.Config + BoltStores *db.Stores + Managers *model.Managers + Config *config.Config Versions *ziti.Versions @@ -91,22 +92,27 @@ type AppEnv struct { ApiClientCsrSigner cert.Signer ControlClientCsrSigner cert.Signer - FingerprintGenerator cert.FingerprintGenerator - AuthRegistry model.AuthRegistry - EnrollRegistry model.EnrollmentRegistry - Broker *Broker - HostController HostController - ManagementApi *managementOperations.ZitiEdgeManagementAPI - ClientApi *clientOperations.ZitiEdgeClientAPI - IdentityRefreshMap cmap.ConcurrentMap[string, time.Time] - identityRefreshMeter metrics.Meter - StartupTime time.Time - InstanceId string - enrollmentSigner jwtsigner.Signer - TraceManager *TraceManager - ServerCert *tls.Certificate - ServerCertSigningMethod jwt.SigningMethod - AuthRateLimiter command.AdaptiveRateLimiter + FingerprintGenerator cert.FingerprintGenerator + AuthRegistry model.AuthRegistry + EnrollRegistry model.EnrollmentRegistry + Broker *Broker + HostController HostController + ManagementApi *managementOperations.ZitiEdgeManagementAPI + ClientApi *clientOperations.ZitiEdgeClientAPI + IdentityRefreshMap cmap.ConcurrentMap[string, time.Time] + identityRefreshMeter metrics.Meter + StartupTime time.Time + InstanceId string + AuthRateLimiter command.AdaptiveRateLimiter + + serverSigner jwtsigner.Signer + ServerCert *tls.Certificate + + TraceManager *TraceManager +} + +func (ae *AppEnv) GetPeerControllerAddresses() []string { + return ae.HostController.GetPeerAddresses() } // JwtSignerKeyFunc is used in combination with jwt.Parse or jwt.ParseWithClaims to @@ -136,9 +142,106 @@ func (ae *AppEnv) JwtSignerKeyFunc(token *jwt.Token) (interface{}, error) { return nil, errors.New("invalid kid: " + targetKid) } +func (ae *AppEnv) ValidateAccessToken(token string) (*common.AccessClaims, error) { + accessClaims := &common.AccessClaims{} + + parsedToken, err := jwt.ParseWithClaims(token, accessClaims, ae.JwtSignerKeyFunc) + + if err != nil { + return nil, err + } + + if !parsedToken.Valid { + return nil, errors.New("access token is invalid") + } + + if !accessClaims.HasAudience(common.ClaimAudienceOpenZiti) { + return nil, fmt.Errorf("invalind audience, expected an instance of %s, got %v", common.ClaimAudienceOpenZiti, accessClaims.Audience) + } + + if accessClaims.Type != common.TokenTypeAccess { + return nil, fmt.Errorf("invalid token type, expected %s, got %s", common.TokenTypeAccess, accessClaims.Type) + } + + tokenRevocation, err := ae.GetManagers().Revocation.Read(accessClaims.JWTID) + + if err != nil && !boltz.IsErrNotFoundErr(err) { + return nil, err + } + + if tokenRevocation != nil { + return nil, errors.New("access token has been revoked by id") + } + + revocation, err := ae.GetManagers().Revocation.Read(accessClaims.Subject) + + if err != nil && !boltz.IsErrNotFoundErr(err) { + return nil, err + } + + if revocation != nil && tokenRevocation.CreatedAt.After(accessClaims.IssuedAt.AsTime()) { + return nil, errors.New("access token has been revoked by identity") + } + + return accessClaims, nil +} + +func (ae *AppEnv) ValidateServiceAccessToken(token string, apiSessionId *string) (*common.ServiceAccessClaims, error) { + serviceAccessClaims := &common.ServiceAccessClaims{} + + parsedToken, err := jwt.ParseWithClaims(token, serviceAccessClaims, ae.JwtSignerKeyFunc) + + if err != nil { + return nil, err + } + + if !parsedToken.Valid { + return nil, errors.New("service access token is invalid") + } + + if !serviceAccessClaims.HasAudience(common.ClaimAudienceOpenZiti) { + return nil, fmt.Errorf("invalind audience, expected an instance of %s, got %v", common.ClaimAudienceOpenZiti, serviceAccessClaims.Audience) + } + + if serviceAccessClaims.TokenType != common.TokenTypeServiceAccess { + return nil, fmt.Errorf("invalid token type, expected %s, got %s", common.TokenTypeServiceAccess, serviceAccessClaims.Type) + } + + if apiSessionId != nil { + if *apiSessionId == "" { + return nil, errors.New("invalid target api session id, must not be empty string") + } + + if serviceAccessClaims.ApiSessionId != *apiSessionId { + return nil, fmt.Errorf("invalid api sessoin id, expected %s, got %s", *apiSessionId, serviceAccessClaims.ApiSessionId) + } + } + + tokenRevocation, err := ae.GetManagers().Revocation.Read(serviceAccessClaims.ID) + + if err != nil && !boltz.IsErrNotFoundErr(err) { + return nil, err + } + + if tokenRevocation != nil { + return nil, errors.New("service access token has been revoked by id") + } + + revocation, err := ae.GetManagers().Revocation.Read(serviceAccessClaims.IdentityId) + + if err != nil && !boltz.IsErrNotFoundErr(err) { + return nil, err + } + + if revocation != nil && tokenRevocation.CreatedAt.After(serviceAccessClaims.IssuedAt.Time) { + return nil, errors.New("service access token has been revoked by identity") + } + + return serviceAccessClaims, nil +} + func (ae *AppEnv) GetServerCert() (serverCert *tls.Certificate, kid string, signingMethod jwt.SigningMethod) { - kid = fmt.Sprintf("%x", sha1.Sum(ae.ServerCert.Certificate[0])) - return ae.ServerCert, kid, ae.ServerCertSigningMethod + return ae.ServerCert, ae.serverSigner.KeyId(), ae.serverSigner.SigningMethod() } func (ae *AppEnv) GetApiServerCsrSigner() cert.Signer { @@ -161,12 +264,12 @@ func (ae *AppEnv) GetManagers() *model.Managers { return ae.Managers } -func (ae *AppEnv) GetConfig() *edgeConfig.Config { +func (ae *AppEnv) GetConfig() *config.Config { return ae.Config } -func (ae *AppEnv) GetJwtSigner() jwtsigner.Signer { - return ae.enrollmentSigner +func (ae *AppEnv) GetServerJwtSigner() jwtsigner.Signer { + return ae.serverSigner } func (ae *AppEnv) GetDbProvider() network.DbProvider { @@ -207,8 +310,11 @@ type HostController interface { Shutdown() Identity() identity.Identity IsRaftEnabled() bool + IsRaftLeader() bool GetPeerSigners() []*x509.Certificate GetEventDispatcher() event.Dispatcher + GetRaftIndex() uint64 + GetPeerAddresses() []string } type Schemes struct { @@ -373,13 +479,13 @@ func (ae *AppEnv) ProcessZtSession(rc *response.RequestContext, ztSession string func (ae *AppEnv) ProcessJwt(rc *response.RequestContext, token *jwt.Token) error { rc.SessionToken = token.Raw rc.Jwt = token - rc.Claims = token.Claims.(*oidc_auth.AccessClaims) + rc.Claims = token.Claims.(*common.AccessClaims) if rc.Claims == nil { return fmt.Errorf("could not convert tonek.Claims from %T to %T", rc.Jwt.Claims, rc.Claims) } - if rc.Claims.Type != oidc_auth.TokenTypeAccess { + if rc.Claims.Type != common.TokenTypeAccess { return errors.New("invalid token") } @@ -405,7 +511,7 @@ func (ae *AppEnv) ProcessJwt(rc *response.RequestContext, token *jwt.Token) erro rc.ApiSession = &model.ApiSession{ BaseEntity: models.BaseEntity{ - Id: rc.Claims.JWTID, + Id: rc.Claims.ApiSessionId, CreatedAt: rc.Claims.IssuedAt.AsTime(), UpdatedAt: rc.Claims.IssuedAt.AsTime(), IsSystem: false, @@ -514,7 +620,7 @@ func ProcessAuthQueries(ae *AppEnv, rc *response.RequestContext) { } } -func NewAppEnv(c *edgeConfig.Config, host HostController) *AppEnv { +func NewAppEnv(c *config.Config, host HostController) *AppEnv { clientSpec, err := loads.Embedded(clientServer.SwaggerJSON, clientServer.FlatSwaggerJSON) if err != nil { pfxlog.Logger().Fatalln(err) @@ -695,7 +801,8 @@ func (ae *AppEnv) getJwtTokenFromRequest(r *http.Request) *jwt.Token { for _, header := range headers { if strings.HasPrefix(header, "Bearer ") { token := header[7:] - parsedToken, err := jwt.ParseWithClaims(token, &oidc_auth.AccessClaims{}, ae.ControllersKeyFunc) + claims := &common.AccessClaims{} + parsedToken, err := jwt.ParseWithClaims(token, claims, ae.ControllersKeyFunc) if err != nil { pfxlog.Logger().WithError(err).Error("error during JWT parsing during API request") @@ -855,14 +962,20 @@ func (ae *AppEnv) HandleServiceUpdatedEventForIdentityId(identityId string) { ae.identityRefreshMeter.Mark(1) } -func (ae *AppEnv) SetEnrollmentSigningCert(serverCert *tls.Certificate) { +func (ae *AppEnv) SetServerCert(serverCert *tls.Certificate) { + ae.ServerCert = serverCert + signMethod := getJwtSigningMethod(serverCert) kid := fmt.Sprintf("%x", sha1.Sum(serverCert.Certificate[0])) - ae.enrollmentSigner = jwtsigner.New(ae.Config.Api.Address, signMethod, serverCert.PrivateKey, kid) + ae.serverSigner = jwtsigner.New(signMethod, serverCert.PrivateKey, kid) + + ae.Broker.routerSyncStrategy.AddPublicKey(ae.ServerCert) } -func (ae *AppEnv) SetServerIdentity(certificate *tls.Certificate) { - ae.ServerCert = certificate - ae.ServerCertSigningMethod = getJwtSigningMethod(certificate) +func (ae *AppEnv) OidcIssuer() string { + return ae.RootIssuer() + "/oidc" +} +func (ae *AppEnv) RootIssuer() string { + return "https://" + ae.Config.Api.Address } diff --git a/controller/env/broker.go b/controller/env/broker.go index 172b62fde..dde6e03b1 100644 --- a/controller/env/broker.go +++ b/controller/env/broker.go @@ -35,7 +35,8 @@ const ( ApiSessionAddedType = int32(edge_ctrl_pb.ContentType_ApiSessionAddedType) ApiSessionUpdatedType = int32(edge_ctrl_pb.ContentType_ApiSessionUpdatedType) RequestClientReSyncType = int32(edge_ctrl_pb.ContentType_RequestClientReSyncType) - SigningCertAdded = int32(edge_ctrl_pb.ContentType_SigningCertAddedType) + DataStateType = int32(edge_ctrl_pb.ContentType_DataStateType) + DataStateEventType = int32(edge_ctrl_pb.ContentType_DataStateEventType) ServerHelloType = int32(edge_ctrl_pb.ContentType_ServerHelloType) ClientHelloType = int32(edge_ctrl_pb.ContentType_ClientHelloType) @@ -45,6 +46,9 @@ const ( EnrollmentExtendRouterVerifyRequestType = int32(edge_ctrl_pb.ContentType_EnrollmentExtendRouterVerifyRequestType) ) +type RouterSyncCache struct { +} + // The Broker delegates Ziti Edge events to a RouterSyncStrategy. Handling the details of which events to watch // and dealing with casting arguments to their proper concrete types. type Broker struct { @@ -69,6 +73,8 @@ func NewBroker(ae *AppEnv, synchronizer RouterSyncStrategy) *Broker { broker.ae.GetStores().ApiSession.GetEventsEmitter().AddListener(db.EventFullyAuthenticated, broker.apiSessionFullyAuthenticated) broker.ae.GetStores().ApiSessionCertificate.AddEntityEventListenerF(broker.apiSessionCertificateCreated, boltz.EntityCreatedAsync) broker.ae.GetStores().ApiSessionCertificate.AddEntityEventListenerF(broker.apiSessionCertificateDeleted, boltz.EntityDeletedAsync) + broker.ae.GetStores().Controller.AddEntityEventListenerF(broker.controllerAdded, boltz.EntityCreated) + broker.ae.GetStores().Controller.AddEntityEventListenerF(broker.controllerAdded, boltz.EntityUpdated) ae.HostController.GetNetwork().AddRouterPresenceHandler(broker) ae.HostController.GetEventDispatcher().AddClusterEventHandler(broker) @@ -77,8 +83,14 @@ func NewBroker(ae *AppEnv, synchronizer RouterSyncStrategy) *Broker { } func (broker *Broker) AcceptClusterEvent(clusterEvent *event.ClusterEvent) { - if clusterEvent.EventType == event.ClusterPeerConnected && len(clusterEvent.Peers) > 0 { - broker.routerSyncStrategy.PeerAdded(clusterEvent.Peers) + if broker.ae.HostController.IsRaftLeader() { + if clusterEvent.EventType == event.ClusterPeerConnected { + broker.ae.Managers.Controller.PeersConnected(clusterEvent.Peers) + } + + if clusterEvent.EventType == event.ClusterPeerDisconnected { + broker.ae.Managers.Controller.PeersDisconnected(clusterEvent.Peers) + } } } @@ -172,3 +184,7 @@ func (broker *Broker) GetEdgeRouterState(id string) RouterStateValues { func (broker *Broker) Stop() { broker.routerSyncStrategy.Stop() } + +func (broker *Broker) controllerAdded(controller *db.Controller) { + broker.routerSyncStrategy.PeerAdded(controller) +} diff --git a/controller/env/sync.go b/controller/env/sync.go index 016c74982..8fcd75d3f 100644 --- a/controller/env/sync.go +++ b/controller/env/sync.go @@ -17,19 +17,19 @@ package env import ( + "crypto/tls" "github.com/openziti/channel/v2" "github.com/openziti/foundation/v2/versions" "github.com/openziti/ziti/controller/db" - "github.com/openziti/ziti/controller/event" "github.com/openziti/ziti/controller/model" "github.com/openziti/ziti/controller/network" "sync" ) -// Aliased type for router strategies +// RouterSyncStrategyType aliased type for router strategies type RouterSyncStrategyType string -// Aliased type for router sync status +// RouterSyncStatus aliased type for router sync status type RouterSyncStatus string const ( @@ -50,6 +50,7 @@ const ( //msg headers SyncStrategyTypeHeader = 1013 SyncStrategyStateHeader = 1014 + SyncStrategyLastIndex = 1015 ) // RouterSyncStrategy handles the life cycle of an Edge Router connecting to the controller, synchronizing @@ -60,7 +61,7 @@ type RouterSyncStrategy interface { Stop() RouterConnectionHandler RouterSynchronizerEventHandler - PeerAdded(peers []*event.ClusterPeer) + AddPublicKey(cert *tls.Certificate) } // RouterConnectionHandler is responsible for handling router connect/disconnect for synchronizing state. @@ -79,6 +80,8 @@ type RouterSynchronizerEventHandler interface { ApiSessionDeleted(apiSession *db.ApiSession) SessionDeleted(session *db.Session) + + PeerAdded(*db.Controller) } // RouterState provides a thread save mechanism to access and set router status information that may be influx diff --git a/controller/handler_edge_ctrl/common.go b/controller/handler_edge_ctrl/common.go index a33918393..9e1f48a6b 100644 --- a/controller/handler_edge_ctrl/common.go +++ b/controller/handler_edge_ctrl/common.go @@ -2,10 +2,8 @@ package handler_edge_ctrl import ( "fmt" - "github.com/openziti/ziti/common/pb/edge_ctrl_pb" - "github.com/openziti/ziti/controller/change" - "github.com/openziti/ziti/controller/fields" "math" + "strings" "time" "github.com/michaelquigley/pfxlog" @@ -14,12 +12,19 @@ import ( "github.com/openziti/identity" "github.com/openziti/sdk-golang/ziti/edge" "github.com/openziti/storage/boltz" + "github.com/openziti/ziti/common" "github.com/openziti/ziti/common/logcontext" + "github.com/openziti/ziti/common/pb/edge_ctrl_pb" + "github.com/openziti/ziti/controller/change" "github.com/openziti/ziti/controller/db" "github.com/openziti/ziti/controller/env" + "github.com/openziti/ziti/controller/fields" "github.com/openziti/ziti/controller/model" + "github.com/openziti/ziti/controller/models" "github.com/openziti/ziti/controller/network" + "github.com/openziti/ziti/controller/oidc_auth" "github.com/openziti/ziti/controller/xt" + "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -111,6 +116,8 @@ type baseSessionRequestContext struct { service *model.Service newSession bool logContext logcontext.Context + env model.Env + accessClaims *common.AccessClaims } func (self *baseSessionRequestContext) newChangeContext() *change.Context { @@ -170,53 +177,140 @@ func (self *baseSessionRequestContext) loadRouter() bool { return true } -func (self *baseSessionRequestContext) loadSession(token string) { - if self.err == nil { - var err error - self.session, err = self.handler.getAppEnv().Managers.Session.ReadByToken(token) - if err != nil { - if boltz.IsErrNotFoundErr(err) { - self.err = InvalidSessionError{} - } else { - self.err = internalError(err) - } - logrus. - WithField("token", token). - WithField("operation", self.handler.Label()). - WithError(self.err).Errorf("invalid session") - return - } - apiSession, err := self.handler.getAppEnv().Managers.ApiSession.Read(self.session.ApiSessionId) - if err != nil { - if boltz.IsErrNotFoundErr(err) { - self.err = InvalidApiSessionError{} - } else { - self.err = internalError(err) - } - logrus. - WithField("token", token). - WithField("operation", self.handler.Label()). - WithError(self.err).Errorf("invalid api-session") - return - } - self.apiSession = apiSession - - self.logContext = logcontext.NewContext() - traceSpec := self.handler.getAppEnv().TraceManager.GetIdentityTrace(apiSession.IdentityId) - traceEnabled := traceSpec != nil && time.Now().Before(traceSpec.Until) - if traceEnabled { - self.logContext.SetChannelsMask(traceSpec.ChannelMask) - self.logContext.WithField("traceId", traceSpec.TraceId) - } - self.logContext.WithField("sessionId", self.session.Id) - self.logContext.WithField("apiSessionId", apiSession.Id) +func (self *baseSessionRequestContext) loadSession(sessionToken string, apiSessionToken string) { + if strings.HasPrefix(sessionToken, oidc_auth.JwtTokenPrefix) { + self.loadFromTokens(sessionToken, apiSessionToken) + } else { + self.loadFromBolt(sessionToken) + } + + if self.err != nil { + return + } + + if self.session == nil { + self.err = internalError(errors.New("session was not found after load")) + return + } + + if self.apiSession == nil { + self.err = internalError(errors.New("api session was not found after load")) + return + } + + self.logContext = logcontext.NewContext() + traceSpec := self.handler.getAppEnv().TraceManager.GetIdentityTrace(self.apiSession.IdentityId) + traceEnabled := traceSpec != nil && time.Now().Before(traceSpec.Until) + if traceEnabled { + self.logContext.SetChannelsMask(traceSpec.ChannelMask) + self.logContext.WithField("traceId", traceSpec.TraceId) + } + self.logContext.WithField("sessionId", self.session.Id) + self.logContext.WithField("apiSessionId", self.apiSession.Id) + + if traceEnabled { + pfxlog.ChannelLogger(logcontext.EstablishPath). + Wire(self.logContext). + Debug("tracing enabled for this session") + } +} + +func (self *baseSessionRequestContext) loadFromTokens(sessionToken, apiSessionToken string) { + if self.err != nil { + return + } + + var err error + self.accessClaims, err = self.env.ValidateAccessToken(apiSessionToken) + + if err != nil { + self.err = internalError(err) + return + } - if traceEnabled { - pfxlog.ChannelLogger(logcontext.EstablishPath). - Wire(self.logContext). - Debug("tracing enabled for this session") + serviceAccessClaims, err := self.env.ValidateServiceAccessToken(sessionToken, &self.accessClaims.ApiSessionId) + + if err != nil { + self.err = internalError(err) + return + } + + if self.accessClaims.Subject != serviceAccessClaims.IdentityId { + self.err = internalError(fmt.Errorf("access and service tokens do not match, got access identity id %s and service identity id %s", self.accessClaims.Subject, serviceAccessClaims.IdentityId)) + return + } + + self.session = &model.Session{ + BaseEntity: models.BaseEntity{ + Id: serviceAccessClaims.ID, + CreatedAt: serviceAccessClaims.IssuedAt.Time, + UpdatedAt: serviceAccessClaims.IssuedAt.Time, + }, + Token: sessionToken, + IdentityId: serviceAccessClaims.IdentityId, + ApiSessionId: serviceAccessClaims.ApiSessionId, + ServiceId: serviceAccessClaims.Subject, + Type: serviceAccessClaims.Type, + } + + tokenIdentity, err := self.env.GetManagers().Identity.Read(self.accessClaims.Subject) + + if err != nil { + self.err = internalError(err) + return + } + + self.apiSession = &model.ApiSession{ + BaseEntity: models.BaseEntity{ + Id: serviceAccessClaims.ApiSessionId, + }, + Token: apiSessionToken, + IdentityId: serviceAccessClaims.IdentityId, + Identity: tokenIdentity, + IPAddress: self.accessClaims.RemoteAddress, + ConfigTypes: self.accessClaims.ConfigTypesAsMap(), + MfaComplete: false, + MfaRequired: false, + ExpiresAt: time.Time{}, + ExpirationDuration: 0, + LastActivityAt: time.Time{}, + AuthenticatorId: "", + } +} + +func (self *baseSessionRequestContext) loadFromBolt(token string) { + if self.err != nil { + return + } + + var err error + self.session, err = self.handler.getAppEnv().Managers.Session.ReadByToken(token) + if err != nil { + if boltz.IsErrNotFoundErr(err) { + self.err = InvalidSessionError{} + } else { + self.err = internalError(err) } + logrus. + WithField("token", token). + WithField("operation", self.handler.Label()). + WithError(self.err).Errorf("invalid session") + return } + apiSession, err := self.handler.getAppEnv().Managers.ApiSession.Read(self.session.ApiSessionId) + if err != nil { + if boltz.IsErrNotFoundErr(err) { + self.err = InvalidApiSessionError{} + } else { + self.err = internalError(err) + } + logrus. + WithField("token", token). + WithField("operation", self.handler.Label()). + WithError(self.err).Errorf("invalid api-session") + return + } + self.apiSession = apiSession } func (self *baseSessionRequestContext) checkSessionType(sessionType string) { @@ -232,10 +326,25 @@ func (self *baseSessionRequestContext) checkSessionType(sessionType string) { } func (self *baseSessionRequestContext) checkSessionFingerprints(fingerprints []string) { - if self.err == nil { - var apiSessionCertFingerprints []string + if self.err != nil { + return + } + + var apiSessionCertFingerprints []string + found := false - found := false + if self.accessClaims != nil { + apiSessionCertFingerprints = self.accessClaims.CertFingerprints + + for _, fingerprint := range fingerprints { + found = stringz.Contains(apiSessionCertFingerprints, fingerprint) + + if found { + break + } + } + + } else { err := self.GetHandler().getAppEnv().Managers.ApiSession.VisitFingerprintsForApiSessionId(self.session.ApiSessionId, func(fingerprint string) bool { apiSessionCertFingerprints = append(apiSessionCertFingerprints, fingerprint) if stringz.Contains(fingerprints, fingerprint) { @@ -246,19 +355,20 @@ func (self *baseSessionRequestContext) checkSessionFingerprints(fingerprints []s }) self.err = internalError(err) + } - if self.err != nil || !found { - if self.err == nil { - self.err = InvalidApiSessionError{} - } - logrus. - WithField("sessionId", self.session.Id). - WithField("operation", self.handler.Label()). - WithField("apiSessionFingerprints", apiSessionCertFingerprints). - WithField("clientFingerprints", fingerprints). - Error("matching fingerprint not found for connect") + if self.err != nil || !found { + if self.err == nil { + self.err = InvalidApiSessionError{} } + logrus. + WithField("sessionId", self.session.Id). + WithField("operation", self.handler.Label()). + WithField("apiSessionFingerprints", apiSessionCertFingerprints). + WithField("clientFingerprints", fingerprints). + Error("matching fingerprint not found for connect") } + } func (self *baseSessionRequestContext) verifyEdgeRouterAccess() { diff --git a/controller/handler_edge_ctrl/create_circuit.go b/controller/handler_edge_ctrl/create_circuit.go index 9e34f85d0..489c70332 100644 --- a/controller/handler_edge_ctrl/create_circuit.go +++ b/controller/handler_edge_ctrl/create_circuit.go @@ -101,7 +101,7 @@ func (self *createCircuitHandler) HandleReceiveCreateCircuitV2(msg *channel.Mess } ctx := &CreateCircuitRequestContext{ - baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg}, + baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg, env: self.appEnv}, req: req, } @@ -123,7 +123,7 @@ func (self *createCircuitHandler) CreateCircuit(ctx *CreateCircuitRequestContext if !ctx.loadRouter() { return } - ctx.loadSession(ctx.req.GetSessionToken()) + ctx.loadSession(ctx.req.GetSessionToken(), ctx.req.GetApiSessionToken()) ctx.checkSessionType(db.SessionTypeDial) ctx.checkSessionFingerprints(ctx.req.GetFingerprints()) ctx.verifyEdgeRouterAccess() @@ -154,6 +154,7 @@ var _ CreateCircuitRequest = (*edge_ctrl_pb.CreateCircuitRequest)(nil) type CreateCircuitRequest interface { GetSessionToken() string + GetApiSessionToken() string GetFingerprints() []string GetTerminatorInstanceId() string GetPeerData() map[uint32][]byte diff --git a/controller/handler_edge_ctrl/create_terminator.go b/controller/handler_edge_ctrl/create_terminator.go index be606078b..78c082daf 100644 --- a/controller/handler_edge_ctrl/create_terminator.go +++ b/controller/handler_edge_ctrl/create_terminator.go @@ -61,7 +61,7 @@ func (self *createTerminatorHandler) HandleReceive(msg *channel.Message, ch chan } ctx := &CreateTerminatorRequestContext{ - baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg}, + baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg, env: self.appEnv}, req: req, } @@ -74,7 +74,7 @@ func (self *createTerminatorHandler) CreateTerminator(ctx *CreateTerminatorReque if !ctx.loadRouter() { return } - ctx.loadSession(ctx.req.SessionToken) + ctx.loadSession(ctx.req.SessionToken, ctx.req.ApiSessionToken) ctx.checkSessionType(db.SessionTypeBind) ctx.checkSessionFingerprints(ctx.req.Fingerprints) ctx.verifyEdgeRouterAccess() diff --git a/controller/handler_edge_ctrl/create_terminator_v2.go b/controller/handler_edge_ctrl/create_terminator_v2.go index 26e8a9d82..37f8d78b6 100644 --- a/controller/handler_edge_ctrl/create_terminator_v2.go +++ b/controller/handler_edge_ctrl/create_terminator_v2.go @@ -65,7 +65,7 @@ func (self *createTerminatorV2Handler) HandleReceive(msg *channel.Message, ch ch } ctx := &CreateTerminatorV2RequestContext{ - baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg}, + baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg, env: self.appEnv}, req: req, } @@ -82,7 +82,7 @@ func (self *createTerminatorV2Handler) CreateTerminatorV2(ctx *CreateTerminatorV return } ctx.verifyTerminatorId(ctx.req.Address) - ctx.loadSession(ctx.req.SessionToken) + ctx.loadSession(ctx.req.SessionToken, ctx.req.ApiSessionToken) ctx.checkSessionType(db.SessionTypeBind) ctx.checkSessionFingerprints(ctx.req.Fingerprints) ctx.verifyEdgeRouterAccess() diff --git a/controller/handler_edge_ctrl/create_tunnel_api_session.go b/controller/handler_edge_ctrl/create_tunnel_api_session.go index 24cfaa8ac..97522164a 100644 --- a/controller/handler_edge_ctrl/create_tunnel_api_session.go +++ b/controller/handler_edge_ctrl/create_tunnel_api_session.go @@ -43,7 +43,7 @@ func (self *createApiSessionHandler) HandleReceive(msg *channel.Message, _ chann ctx := &createApiSessionRequestContext{ baseTunnelRequestContext: baseTunnelRequestContext{ - baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg}, + baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg, env: self.appEnv}, }, req: req, } diff --git a/controller/handler_edge_ctrl/create_tunnel_circuit.go b/controller/handler_edge_ctrl/create_tunnel_circuit.go index 9545c22e7..9965dafcc 100644 --- a/controller/handler_edge_ctrl/create_tunnel_circuit.go +++ b/controller/handler_edge_ctrl/create_tunnel_circuit.go @@ -74,7 +74,7 @@ func (self *createCircuitForServiceHandler) HandleReceive(msg *channel.Message, ctx := &CreateCircuitForServiceRequestContext{ baseTunnelRequestContext: baseTunnelRequestContext{ - baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg}, + baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg, env: self.appEnv}, }, req: req, } diff --git a/controller/handler_edge_ctrl/create_tunnel_terminator.go b/controller/handler_edge_ctrl/create_tunnel_terminator.go index adcda7021..4a42b3084 100644 --- a/controller/handler_edge_ctrl/create_tunnel_terminator.go +++ b/controller/handler_edge_ctrl/create_tunnel_terminator.go @@ -59,7 +59,6 @@ func (self *createTunnelTerminatorHandler) Label() string { func (self *createTunnelTerminatorHandler) HandleReceive(msg *channel.Message, ch channel.Channel) { startTime := time.Now() - req := &edge_ctrl_pb.CreateTunnelTerminatorRequest{} if err := proto.Unmarshal(msg.Body, req); err != nil { pfxlog.ContextLogger(ch.Label()).WithError(err).Error("could not unmarshal CreateTerminatorRequest") @@ -68,7 +67,7 @@ func (self *createTunnelTerminatorHandler) HandleReceive(msg *channel.Message, c ctx := &CreateTunnelTerminatorRequestContext{ baseTunnelRequestContext: baseTunnelRequestContext{ - baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg}, + baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg, env: self.appEnv}, apiSession: nil, identity: nil, }, diff --git a/controller/handler_edge_ctrl/health_event.go b/controller/handler_edge_ctrl/health_event.go index eea7e8abe..537c6b674 100644 --- a/controller/handler_edge_ctrl/health_event.go +++ b/controller/handler_edge_ctrl/health_event.go @@ -61,7 +61,7 @@ func (self *healthEventHandler) HandleReceive(msg *channel.Message, ch channel.C } ctx := &HealthEventRequestContext{ - baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg}, + baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg, env: self.appEnv}, req: req, } @@ -73,7 +73,7 @@ func (self *healthEventHandler) handleHealthEvent(ctx *HealthEventRequestContext return } - ctx.loadSession(ctx.req.SessionToken) + ctx.loadSession(ctx.req.SessionToken, ctx.req.ApiSessionToken) ctx.checkSessionType(db.SessionTypeBind) ctx.checkSessionFingerprints(ctx.req.Fingerprints) diff --git a/controller/handler_edge_ctrl/hello.go b/controller/handler_edge_ctrl/hello.go index e79ffed4e..3d037cee5 100644 --- a/controller/handler_edge_ctrl/hello.go +++ b/controller/handler_edge_ctrl/hello.go @@ -26,10 +26,10 @@ import ( type helloHandler struct { appEnv *env.AppEnv - callback func(routerId string, respHello *edge_ctrl_pb.ClientHello) + callback func(routerId string, msg *channel.Message, respHello *edge_ctrl_pb.ClientHello) } -func NewHelloHandler(appEnv *env.AppEnv, callback func(routerId string, respHello *edge_ctrl_pb.ClientHello)) *helloHandler { +func NewHelloHandler(appEnv *env.AppEnv, callback func(routerId string, msg *channel.Message, respHello *edge_ctrl_pb.ClientHello)) *helloHandler { return &helloHandler{ appEnv: appEnv, callback: callback, @@ -47,5 +47,5 @@ func (h *helloHandler) HandleReceive(msg *channel.Message, ch channel.Channel) { return } - h.callback(ch.Id(), respHello) + h.callback(ch.Id(), msg, respHello) } diff --git a/controller/handler_edge_ctrl/list_tunnel_services.go b/controller/handler_edge_ctrl/list_tunnel_services.go index 6a86548bb..9c291aacf 100644 --- a/controller/handler_edge_ctrl/list_tunnel_services.go +++ b/controller/handler_edge_ctrl/list_tunnel_services.go @@ -40,7 +40,7 @@ func (self *listTunnelServicesHandler) HandleReceive(msg *channel.Message, _ cha ctx := &listTunnelServicesRequestContext{ baseTunnelRequestContext: baseTunnelRequestContext{ - baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg}, + baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg, env: self.appEnv}, }, } diff --git a/controller/handler_edge_ctrl/remove_terminator.go b/controller/handler_edge_ctrl/remove_terminator.go index a34c90b18..1b09c8e18 100644 --- a/controller/handler_edge_ctrl/remove_terminator.go +++ b/controller/handler_edge_ctrl/remove_terminator.go @@ -65,7 +65,7 @@ func (self *removeTerminatorHandler) HandleReceive(msg *channel.Message, ch chan } ctx := &RemoveTerminatorRequestContext{ - baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg}, + baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg, env: self.appEnv}, req: req, } diff --git a/controller/handler_edge_ctrl/remove_tunnel_terminator.go b/controller/handler_edge_ctrl/remove_tunnel_terminator.go index 76f3b7341..4a8b273b2 100644 --- a/controller/handler_edge_ctrl/remove_tunnel_terminator.go +++ b/controller/handler_edge_ctrl/remove_tunnel_terminator.go @@ -47,7 +47,7 @@ func (self *removeTunnelTerminatorHandler) Label() string { func (self *removeTunnelTerminatorHandler) HandleReceive(msg *channel.Message, _ channel.Channel) { ctx := &RemoveTunnelTerminatorRequestContext{ - baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg}, + baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg, env: self.appEnv}, terminatorId: string(msg.Body), } diff --git a/controller/handler_edge_ctrl/tunnel_health_event.go b/controller/handler_edge_ctrl/tunnel_health_event.go index 858c6b64b..30e30a9ea 100644 --- a/controller/handler_edge_ctrl/tunnel_health_event.go +++ b/controller/handler_edge_ctrl/tunnel_health_event.go @@ -18,10 +18,10 @@ package handler_edge_ctrl import ( "github.com/openziti/channel/v2" + "github.com/openziti/metrics" "github.com/openziti/ziti/common" "github.com/openziti/ziti/common/pb/edge_ctrl_pb" "github.com/openziti/ziti/controller/env" - "github.com/openziti/metrics" "time" ) @@ -56,7 +56,7 @@ func (self *tunnelHealthEventHandler) HandleReceive(msg *channel.Message, _ chan checkPassed, _ := msg.GetBoolHeader(int32(edge_ctrl_pb.Header_CheckPassed)) ctx := &TunnelHealthEventRequestContext{ - baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg}, + baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg, env: self.appEnv}, terminatorId: terminatorId, checkPassed: checkPassed, } diff --git a/controller/handler_edge_ctrl/update_terminator.go b/controller/handler_edge_ctrl/update_terminator.go index cca50fa91..624345834 100644 --- a/controller/handler_edge_ctrl/update_terminator.go +++ b/controller/handler_edge_ctrl/update_terminator.go @@ -56,7 +56,7 @@ func (self *updateTerminatorHandler) HandleReceive(msg *channel.Message, ch chan } ctx := &UpdateTerminatorRequestContext{ - baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg}, + baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg, env: self.appEnv}, req: req, } @@ -79,7 +79,7 @@ func (self *updateTerminatorHandler) UpdateTerminator(ctx *UpdateTerminatorReque logger.Debug("update request received") - ctx.loadSession(ctx.req.SessionToken) + ctx.loadSession(ctx.req.SessionToken, ctx.req.ApiSessionToken) ctx.checkSessionType(db.SessionTypeBind) ctx.checkSessionFingerprints(ctx.req.Fingerprints) terminator := ctx.verifyTerminator(ctx.req.TerminatorId, common.EdgeBinding) diff --git a/controller/handler_edge_ctrl/update_tunnel_terminator.go b/controller/handler_edge_ctrl/update_tunnel_terminator.go index b0bdb541b..d296c64cb 100644 --- a/controller/handler_edge_ctrl/update_tunnel_terminator.go +++ b/controller/handler_edge_ctrl/update_tunnel_terminator.go @@ -55,7 +55,7 @@ func (self *updateTunnelTerminatorHandler) HandleReceive(msg *channel.Message, c } ctx := &UpdateTunnelTerminatorRequestContext{ - baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg}, + baseSessionRequestContext: baseSessionRequestContext{handler: self, msg: msg, env: self.appEnv}, req: req, } diff --git a/controller/internal/routes/ca_router.go b/controller/internal/routes/ca_router.go index 42fb0a454..59decd23f 100644 --- a/controller/internal/routes/ca_router.go +++ b/controller/internal/routes/ca_router.go @@ -266,11 +266,13 @@ func (r *CaRouter) generateJwt(ae *env.AppEnv, rc *response.RequestContext) { claims := &ziti.EnrollmentClaims{ EnrollmentMethod: method, RegisteredClaims: jwt.RegisteredClaims{ - Issuer: fmt.Sprintf(`https://%s/`, ae.Config.Api.Address), + Issuer: fmt.Sprintf(`https://%s/`, ae.Config.Api.Address), + Subject: ca.Id, + ID: ca.Id, }, } - jwtStr, genErr := ae.GetJwtSigner().Generate(ca.Id, ca.Id, claims) + jwtStr, genErr := ae.GetServerJwtSigner().Generate(claims) if genErr != nil { rc.RespondWithError(errors.New("could not generate claims")) diff --git a/controller/internal/routes/controller_api_model.go b/controller/internal/routes/controller_api_model.go new file mode 100644 index 000000000..6a5a0c4df --- /dev/null +++ b/controller/internal/routes/controller_api_model.go @@ -0,0 +1,49 @@ +/* + Copyright NetFoundry Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package routes + +import ( + "github.com/openziti/edge-api/rest_model" + "github.com/openziti/ziti/controller/env" + "github.com/openziti/ziti/controller/model" + "github.com/openziti/ziti/controller/response" +) + +const EntityNameController = "controllers" + +var ControllerLinkFactory = NewBasicLinkFactory(EntityNameController) + +func MapControllerToRestEntity(_ *env.AppEnv, _ *response.RequestContext, Controller *model.Controller) (interface{}, error) { + return MapControllerToRestModel(Controller) +} + +func MapControllerToRestModel(controller *model.Controller) (*rest_model.ControllerDetail, error) { + ret := &rest_model.ControllerDetail{ + BaseEntity: BaseEntityToRestModel(controller, ControllerLinkFactory), + Name: &controller.Name, + Address: &controller.Address, + CertPem: &controller.CertPem, + Fingerprint: &controller.Fingerprint, + IsOnline: &controller.IsOnline, + } + + if controller.LastJoinedAt != nil { + ret.LastJoinedAt = toStrFmtDateTimeP(*controller.LastJoinedAt) + } + + return ret, nil +} diff --git a/controller/internal/routes/controller_router.go b/controller/internal/routes/controller_router.go new file mode 100644 index 000000000..27d984f5e --- /dev/null +++ b/controller/internal/routes/controller_router.go @@ -0,0 +1,56 @@ +/* + Copyright NetFoundry Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package routes + +import ( + "github.com/go-openapi/runtime/middleware" + controllersClient "github.com/openziti/edge-api/rest_client_api_server/operations/controllers" + controllersMan "github.com/openziti/edge-api/rest_management_api_server/operations/controllers" + "github.com/openziti/ziti/controller/env" + "github.com/openziti/ziti/controller/internal/permissions" + "github.com/openziti/ziti/controller/model" + "github.com/openziti/ziti/controller/response" +) + +func init() { + r := NewControllerRouter() + env.AddRouter(r) +} + +type ControllerRouter struct { + BasePath string +} + +func NewControllerRouter() *ControllerRouter { + return &ControllerRouter{ + BasePath: "/" + EntityNameController, + } +} + +func (r *ControllerRouter) Register(ae *env.AppEnv) { + ae.ManagementApi.ControllersListControllersHandler = controllersMan.ListControllersHandlerFunc(func(params controllersMan.ListControllersParams, _ interface{}) middleware.Responder { + return ae.IsAllowed(r.List, params.HTTPRequest, "", "", permissions.IsAdmin()) + }) + + ae.ClientApi.ControllersListControllersHandler = controllersClient.ListControllersHandlerFunc(func(params controllersClient.ListControllersParams, _ interface{}) middleware.Responder { + return ae.IsAllowed(r.List, params.HTTPRequest, "", "", permissions.IsAdmin()) + }) +} + +func (r *ControllerRouter) List(ae *env.AppEnv, rc *response.RequestContext) { + ListWithHandler[*model.Controller](ae, rc, ae.Managers.Controller, MapControllerToRestEntity) +} diff --git a/controller/internal/routes/current_identity_router.go b/controller/internal/routes/current_identity_router.go index a5577fc73..338ca4681 100644 --- a/controller/internal/routes/current_identity_router.go +++ b/controller/internal/routes/current_identity_router.go @@ -18,20 +18,15 @@ package routes import ( "github.com/go-openapi/runtime/middleware" - "github.com/michaelquigley/pfxlog" clientCurrentIdentity "github.com/openziti/edge-api/rest_client_api_server/operations/current_identity" managementCurrentIdentity "github.com/openziti/edge-api/rest_management_api_server/operations/current_identity" "github.com/openziti/edge-api/rest_model" - "github.com/openziti/foundation/v2/errorz" "github.com/openziti/foundation/v2/stringz" - "github.com/openziti/storage/boltz" "github.com/openziti/ziti/controller/apierror" - "github.com/openziti/ziti/controller/db" "github.com/openziti/ziti/controller/env" "github.com/openziti/ziti/controller/internal/permissions" "github.com/openziti/ziti/controller/model" "github.com/openziti/ziti/controller/response" - "github.com/pkg/errors" "net/http" ) @@ -141,54 +136,23 @@ func (r *CurrentIdentityRouter) Register(ae *env.AppEnv) { } func (r *CurrentIdentityRouter) verifyMfa(ae *env.AppEnv, rc *response.RequestContext, body *rest_model.MfaCode) { - mfa, err := ae.Managers.Mfa.ReadOneByIdentityId(rc.Identity.Id) + changeCtx := rc.NewChangeContext() + err := ae.Managers.Mfa.CompleteTotpEnrollment(rc.Identity.Id, *body.Code, changeCtx) if err != nil { rc.RespondWithError(err) return } - if mfa == nil { - rc.RespondWithNotFound() - return - } - - if mfa.IsVerified { - rc.RespondWithNotFound() - return - } - - ok, err := ae.Managers.Mfa.VerifyTOTP(mfa, *body.Code) + err = ae.Managers.ApiSession.SetMfaPassed(rc.ApiSession, changeCtx) if err != nil { - rc.RespondWithError(apierror.NewInvalidMfaTokenError()) + rc.RespondWithError(err) return } - if ok { - changeCtx := rc.NewChangeContext() - mfa.IsVerified = true - if err := ae.Managers.Mfa.Update(mfa, nil, changeCtx); err != nil { - pfxlog.Logger().Errorf("could not update MFA with new MFA status: %v", err) - rc.RespondWithApiError(errorz.NewUnhandled(errors.New("could not update MFA status"))) - return - } - - rc.ApiSession.MfaComplete = true - rc.ApiSession.MfaRequired = true - - if err := ae.Managers.ApiSession.UpdateWithFieldChecker(rc.ApiSession, boltz.MapFieldChecker{db.FieldApiSessionMfaComplete: struct{}{}, db.FieldApiSessionMfaRequired: struct{}{}}, changeCtx); err != nil { - pfxlog.Logger().Errorf("could not update API Session with new MFA status: %v", err) - } - - ae.Managers.PostureResponse.SetMfaPosture(rc.Identity.Id, rc.ApiSession.Id, true) - - rc.RespondWithEmptyOk() - return - - } + rc.RespondWithEmptyOk() - rc.RespondWithError(apierror.NewInvalidMfaTokenError()) } func (r *CurrentIdentityRouter) createMfa(ae *env.AppEnv, rc *response.RequestContext) { diff --git a/controller/internal/routes/service_router.go b/controller/internal/routes/service_router.go index 2f63bfb7c..d1dc3c02c 100644 --- a/controller/internal/routes/service_router.go +++ b/controller/internal/routes/service_router.go @@ -21,6 +21,8 @@ import ( "github.com/michaelquigley/pfxlog" clientService "github.com/openziti/edge-api/rest_client_api_server/operations/service" managementService "github.com/openziti/edge-api/rest_management_api_server/operations/service" + "github.com/openziti/edge-api/rest_model" + "github.com/openziti/foundation/v2/errorz" "github.com/openziti/metrics" "github.com/openziti/storage/boltz" "github.com/openziti/ziti/controller/fields" @@ -67,6 +69,12 @@ func (r *ServiceRouter) Register(ae *env.AppEnv) { return ae.IsAllowed(r.listClientTerminators, params.HTTPRequest, params.ID, "", permissions.IsAuthenticated()) }) + ae.ClientApi.ServiceListServiceEdgeRoutersHandler = clientService.ListServiceEdgeRoutersHandlerFunc(func(params clientService.ListServiceEdgeRoutersParams, i interface{}) middleware.Responder { + return ae.IsAllowed(func(ae *env.AppEnv, rc *response.RequestContext) { + r.listClientEdgeRouters(ae, rc, params) + }, params.HTTPRequest, params.ID, "", permissions.IsAuthenticated()) + }) + //Management ae.ManagementApi.ServiceDeleteServiceHandler = managementService.DeleteServiceHandlerFunc(func(params managementService.DeleteServiceParams, _ interface{}) middleware.Responder { return ae.IsAllowed(r.Delete, params.HTTPRequest, params.ID, "", permissions.IsAdmin()) @@ -301,3 +309,71 @@ func (r *ServiceRouter) listEdgeRouters(ae *env.AppEnv, rc *response.RequestCont filterTemplate := `not isEmpty(from serviceEdgeRouterPolicies where anyOf(services) = "%v")` ListAssociationsWithFilter[*model.EdgeRouter](ae, rc, filterTemplate, ae.Managers.EdgeRouter, MapEdgeRouterToRestEntity) } + +func (r *ServiceRouter) listClientEdgeRouters(ae *env.AppEnv, rc *response.RequestContext, params clientService.ListServiceEdgeRoutersParams) { + serviceId, err := rc.GetEntityId() + + if err != nil { + rc.RespondWithError(err) + return + } + + if params.SessionToken != nil { + _, err := ae.ValidateServiceAccessToken(*params.SessionToken, &rc.ApiSession.Id) + if err != nil { + apiErr := errorz.NewUnauthorized() + apiErr.Cause = err + rc.RespondWithError(apiErr) + return + } + } + + svc, err := ae.Managers.EdgeService.ReadForIdentity(serviceId, rc.Identity.Id, nil) + + if err != nil { + if boltz.IsErrNotFoundErr(err) { + rc.RespondWithNotFound() + } else { + rc.RespondWithError(err) + } + return + } + + if svc == nil { + rc.RespondWithNotFound() + return + } + + Detail(rc, func(rc *response.RequestContext, id string) (interface{}, error) { + return getServiceEdgeRouters(ae, rc, serviceId) + }) +} + +func getServiceEdgeRouters(ae *env.AppEnv, rc *response.RequestContext, serviceId string) (*rest_model.ServiceEdgeRouters, error) { + edgeRouters := &rest_model.ServiceEdgeRouters{} + + edgeRoutersForSvc, err := ae.Managers.EdgeRouter.ListForIdentityAndService(rc.Identity.Id, serviceId, nil) + if err != nil { + return nil, err + } + + for _, edgeRouter := range edgeRoutersForSvc.EdgeRouters { + state := ae.Broker.GetEdgeRouterState(edgeRouter.Id) + + syncStatus := string(state.SyncStatus) + cost := int64(edgeRouter.Cost) + er := &rest_model.CommonEdgeRouterProperties{ + Hostname: &state.Hostname, + IsOnline: &state.IsOnline, + Name: &edgeRouter.Name, + SupportedProtocols: state.Protocols, + SyncStatus: &syncStatus, + Cost: &cost, + NoTraversal: &edgeRouter.NoTraversal, + Disabled: &edgeRouter.Disabled, + } + edgeRouters.EdgeRouters = append(edgeRouters.EdgeRouters, er) + } + + return edgeRouters, nil +} diff --git a/controller/internal/routes/session_router.go b/controller/internal/routes/session_router.go index 30f192f47..6b049a58a 100644 --- a/controller/internal/routes/session_router.go +++ b/controller/internal/routes/session_router.go @@ -18,14 +18,16 @@ package routes import ( "github.com/go-openapi/runtime/middleware" + "github.com/michaelquigley/pfxlog" "github.com/openziti/edge-api/rest_client_api_server/operations/session" clientSession "github.com/openziti/edge-api/rest_client_api_server/operations/session" managementSession "github.com/openziti/edge-api/rest_management_api_server/operations/session" "github.com/openziti/edge-api/rest_model" + "github.com/openziti/metrics" "github.com/openziti/ziti/controller/env" "github.com/openziti/ziti/controller/internal/permissions" "github.com/openziti/ziti/controller/response" - "github.com/openziti/metrics" + "net/http" "time" ) @@ -123,10 +125,45 @@ func (r *SessionRouter) Delete(ae *env.AppEnv, rc *response.RequestContext) { func (r *SessionRouter) Create(ae *env.AppEnv, rc *response.RequestContext, params session.CreateSessionParams) { start := time.Now() - responder := &SessionRequestResponder{ae: ae, Responder: rc} - CreateWithResponder(rc, responder, SessionLinkFactory, func() (string, error) { - return ae.Managers.Session.Create(MapCreateSessionToModel(rc.Identity.Id, rc.ApiSession.Id, params.Session), rc.NewChangeContext()) - }) + if rc.Claims != nil { + request := MapCreateSessionToModel(rc.Claims.Subject, rc.Claims.ApiSessionId, params.Session) + token, err := ae.Managers.Session.CreateJwt(request, rc.NewChangeContext()) + + if err != nil { + rc.RespondWithError(err) + return + } + + edgeRouters, err := getSessionEdgeRouters(ae, request) + if err != nil { + pfxlog.Logger().Errorf("could not render edge routers for jwt session: %s", err) + } + + sessionType := rest_model.DialBind(request.Type) + + newSessionEnvelope := &rest_model.SessionCreateEnvelope{ + Data: &rest_model.SessionDetail{ + BaseEntity: rest_model.BaseEntity{ + ID: &request.Id, + }, + APISessionID: &rc.ApiSession.Id, + EdgeRouters: edgeRouters, + IdentityID: &rc.Identity.Id, + ServiceID: &request.ServiceId, + Token: &token, + Type: &sessionType, + }, + Meta: &rest_model.Meta{}, + } + + rc.Respond(newSessionEnvelope, http.StatusCreated) + } else { + responder := &SessionRequestResponder{ae: ae, Responder: rc} + CreateWithResponder(rc, responder, SessionLinkFactory, func() (string, error) { + return ae.Managers.Session.Create(MapCreateSessionToModel(rc.Identity.Id, rc.ApiSession.Id, params.Session), rc.NewChangeContext()) + }) + } + r.createTimer.UpdateSince(start) } diff --git a/controller/jwtsigner/jwt.go b/controller/jwtsigner/jwt.go index ec67b9719..96c56f6a9 100644 --- a/controller/jwtsigner/jwt.go +++ b/controller/jwtsigner/jwt.go @@ -17,30 +17,40 @@ package jwtsigner import ( + "crypto" "github.com/golang-jwt/jwt/v5" ) type Signer interface { - Generate(string, string, jwt.Claims) (string, error) + Generate(jwt.Claims) (string, error) + SigningMethod() jwt.SigningMethod + KeyId() string } -type IdentitySigner struct { +type SignerImpl struct { signingMethod jwt.SigningMethod issuer string - key interface{} + key crypto.PrivateKey keyId string } -func New(issuer string, sm jwt.SigningMethod, key interface{}, keyId string) *IdentitySigner { - return &IdentitySigner{ +func New(sm jwt.SigningMethod, key crypto.PrivateKey, keyId string) *SignerImpl { + return &SignerImpl{ signingMethod: sm, - issuer: issuer, key: key, keyId: keyId, } } -func (j *IdentitySigner) Generate(subj, jti string, claims jwt.Claims) (string, error) { +func (j *SignerImpl) SigningMethod() jwt.SigningMethod { + return j.signingMethod +} + +func (j *SignerImpl) KeyId() string { + return j.keyId +} + +func (j *SignerImpl) Generate(claims jwt.Claims) (string, error) { token := jwt.NewWithClaims(j.signingMethod, claims) if j.keyId != "" { diff --git a/controller/model/api_session_manager.go b/controller/model/api_session_manager.go index 6469240e9..747f49a6b 100644 --- a/controller/model/api_session_manager.go +++ b/controller/model/api_session_manager.go @@ -295,6 +295,20 @@ func (self *ApiSessionManager) DeleteByIdentityId(identityId string, changeCtx * }) } +func (self *ApiSessionManager) SetMfaPassed(apiSession *ApiSession, changeCtx *change.Context) error { + apiSession.MfaComplete = true + apiSession.MfaRequired = true + + if err := self.UpdateWithFieldChecker(apiSession, boltz.MapFieldChecker{db.FieldApiSessionMfaComplete: struct{}{}, db.FieldApiSessionMfaRequired: struct{}{}}, changeCtx); err != nil { + pfxlog.Logger().Errorf("could not update API Session with new MFA status: %v", err) + return err + } + + self.env.GetManagers().PostureResponse.SetMfaPosture(apiSession.IdentityId, apiSession.Id, true) + + return nil +} + type ApiSessionListResult struct { manager *ApiSessionManager ApiSessions []*ApiSession diff --git a/controller/model/controller_manager.go b/controller/model/controller_manager.go new file mode 100644 index 000000000..d8367c62d --- /dev/null +++ b/controller/model/controller_manager.go @@ -0,0 +1,246 @@ +/* + Copyright NetFoundry Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package model + +import ( + "github.com/michaelquigley/pfxlog" + nfpem "github.com/openziti/foundation/v2/pem" + "github.com/openziti/foundation/v2/stringz" + "github.com/openziti/storage/boltz" + "github.com/openziti/ziti/common/pb/edge_cmd_pb" + "github.com/openziti/ziti/controller/change" + "github.com/openziti/ziti/controller/command" + "github.com/openziti/ziti/controller/db" + "github.com/openziti/ziti/controller/event" + "github.com/openziti/ziti/controller/fields" + "github.com/openziti/ziti/controller/models" + "github.com/openziti/ziti/controller/network" + "go.etcd.io/bbolt" + "google.golang.org/protobuf/proto" + "time" +) + +func NewControllerManager(env Env) *ControllerManager { + manager := &ControllerManager{ + baseEntityManager: newBaseEntityManager[*Controller, *db.Controller](env, env.GetStores().Controller), + } + manager.impl = manager + + network.RegisterManagerDecoder[*Controller](env.GetHostController().GetNetwork().Managers, manager) + + return manager +} + +type ControllerManager struct { + baseEntityManager[*Controller, *db.Controller] +} + +func (self *ControllerManager) newModelEntity() *Controller { + return &Controller{} +} + +func (self *ControllerManager) Create(entity *Controller, ctx *change.Context) error { + return network.DispatchCreate[*Controller](self, entity, ctx) +} + +func (self *ControllerManager) ApplyCreate(cmd *command.CreateEntityCommand[*Controller], ctx boltz.MutateContext) error { + _, err := self.createEntity(cmd.Entity, ctx) + return err +} + +func (self *ControllerManager) Update(entity *Controller, checker fields.UpdatedFields, ctx *change.Context) error { + return network.DispatchUpdate[*Controller](self, entity, checker, ctx) +} + +func (self *ControllerManager) ApplyUpdate(cmd *command.UpdateEntityCommand[*Controller], ctx boltz.MutateContext) error { + return self.updateEntity(cmd.Entity, cmd.UpdatedFields, ctx) +} + +func (self *ControllerManager) Read(id string) (*Controller, error) { + modelEntity := &Controller{} + if err := self.readEntity(id, modelEntity); err != nil { + return nil, err + } + return modelEntity, nil +} + +func (self *ControllerManager) readInTx(tx *bbolt.Tx, id string) (*Controller, error) { + modelEntity := &Controller{} + if err := self.readEntityInTx(tx, id, modelEntity); err != nil { + return nil, err + } + return modelEntity, nil +} + +func (self *ControllerManager) ReadByName(name string) (*Controller, error) { + modelEntity := &Controller{} + nameIndex := self.env.GetStores().Controller.GetNameIndex() + if err := self.readEntityWithIndex("name", []byte(name), nameIndex, modelEntity); err != nil { + return nil, err + } + return modelEntity, nil +} + +func (self *ControllerManager) MapControllerNamesToIds(values []string, identityId string) map[string]struct{} { + var result []string + if stringz.Contains(values, "all") { + result = []string{"all"} + } else { + for _, val := range values { + if Controller, _ := self.Read(val); Controller != nil { + result = append(result, val) + } else if Controller, _ := self.ReadByName(val); Controller != nil { + result = append(result, Controller.Id) + } else { + pfxlog.Logger().Debugf("user %v submitted %v as a config type of interest, but no matching records found", identityId, val) + } + } + } + return stringz.SliceToSet(result) +} + +func (self *ControllerManager) Marshall(entity *Controller) ([]byte, error) { + msg := &edge_cmd_pb.Controller{ + Id: entity.Id, + Name: entity.Name, + Address: entity.Address, + CertPem: entity.CertPem, + Fingerprint: entity.Fingerprint, + IsOnline: entity.IsOnline, + LastJoinedAt: timePtrToPb(entity.LastJoinedAt), + } + + return proto.Marshal(msg) +} + +func (self *ControllerManager) Unmarshall(bytes []byte) (*Controller, error) { + msg := &edge_cmd_pb.Controller{} + + if err := proto.Unmarshal(bytes, msg); err != nil { + return nil, err + } + + return &Controller{ + BaseEntity: models.BaseEntity{ + Id: msg.Id, + Tags: edge_cmd_pb.DecodeTags(msg.Tags), + }, + Name: msg.Name, + Address: msg.Address, + CertPem: msg.CertPem, + Fingerprint: msg.Fingerprint, + IsOnline: msg.IsOnline, + LastJoinedAt: pbTimeToTimePtr(msg.LastJoinedAt), + }, nil +} + +func (self *ControllerManager) PeersConnected(peers []*event.ClusterPeer) { + var controllerIds []string + err := self.ListWithHandler("", func(tx *bbolt.Tx, ids []string, qmd *models.QueryMetaData) error { + controllerIds = ids + return nil + }) + + changeCtx := change.New() + changeCtx.SetSourceType("raft.peers.connected"). + SetChangeAuthorType(change.AuthorTypeController) + + if err != nil { + pfxlog.Logger().WithError(err).Error("could not list controllers to handle new peer(s) connection") + return + } + + connectFields := fields.UpdatedFieldsMap{ + db.FieldControllerLastJoinedAt: struct{}{}, + db.FieldControllerCertPem: struct{}{}, + db.FieldControllerFingerprint: struct{}{}, + db.FieldControllerIsOnline: struct{}{}, + db.FieldControllerAddress: struct{}{}, + } + + now := time.Now() + + for _, peer := range peers { + if stringz.Contains(controllerIds, peer.Id) { + existing, err := self.Read(peer.Id) + + if err != nil { + pfxlog.Logger().WithError(err).Error("could not handle new peer(s) connection, existing controller could not be read") + continue + } + + existing.Address = peer.Addr + existing.IsOnline = true + existing.LastJoinedAt = &now + + if len(peer.ServerCert) > 0 { + existing.CertPem = nfpem.EncodeToString(peer.ServerCert[0]) + existing.Fingerprint = nfpem.FingerprintFromCertificate(peer.ServerCert[0]) + } + + if err := self.Update(existing, connectFields, changeCtx); err != nil { + pfxlog.Logger().WithError(err).Error("could not update controller during peer(s) connection") + } + } else { + if len(peer.ServerCert) == 0 { + pfxlog.Logger().Error("could not create controller during peer(s) connection, no server certificate provided") + continue + } + + newController := &Controller{ + BaseEntity: models.BaseEntity{ + Id: peer.Id, + }, + Address: peer.Addr, + IsOnline: true, + LastJoinedAt: &now, + } + + newController.Name = peer.ServerCert[0].Subject.CommonName + newController.CertPem = nfpem.EncodeToString(peer.ServerCert[0]) + newController.Fingerprint = nfpem.FingerprintFromCertificate(peer.ServerCert[0]) + + if err := self.Create(newController, changeCtx); err != nil { + pfxlog.Logger().WithError(err).Error("could not create controller during peer(s) connection") + continue + } + } + } +} + +func (self *ControllerManager) PeersDisconnected(peers []*event.ClusterPeer) { + changeCtx := change.New() + changeCtx.SetSourceType("raft.peers.disconnected"). + SetChangeAuthorType(change.AuthorTypeController) + + disconnectFields := fields.UpdatedFieldsMap{ + db.FieldControllerLastJoinedAt: struct{}{}, + db.FieldControllerIsOnline: struct{}{}, + } + for _, peer := range peers { + controller := &Controller{ + BaseEntity: models.BaseEntity{ + Id: peer.Id, + }, + IsOnline: false, + } + + if err := self.Update(controller, disconnectFields, changeCtx); err != nil { + pfxlog.Logger().WithError(err).Error("could not update controller during peer(s) disconnection") + } + } +} diff --git a/controller/model/controller_model.go b/controller/model/controller_model.go new file mode 100644 index 000000000..c4c53972c --- /dev/null +++ b/controller/model/controller_model.go @@ -0,0 +1,69 @@ +/* + Copyright NetFoundry Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package model + +import ( + "github.com/openziti/storage/boltz" + "github.com/openziti/ziti/controller/db" + "github.com/openziti/ziti/controller/models" + "go.etcd.io/bbolt" + "time" +) + +type Controller struct { + models.BaseEntity + Name string + Address string + CertPem string + Fingerprint string + IsOnline bool + LastJoinedAt *time.Time +} + +func (entity *Controller) toBoltEntity(tx *bbolt.Tx, env Env) (*db.Controller, error) { + boltEntity := &db.Controller{ + BaseExtEntity: *boltz.NewExtEntity(entity.Id, entity.Tags), + Name: entity.Name, + Address: entity.Address, + CertPem: entity.CertPem, + Fingerprint: entity.Fingerprint, + IsOnline: entity.IsOnline, + LastJoinedAt: entity.LastJoinedAt, + } + + return boltEntity, nil +} + +func (entity *Controller) toBoltEntityForCreate(tx *bbolt.Tx, env Env) (*db.Controller, error) { + return entity.toBoltEntity(tx, env) +} + +func (entity *Controller) toBoltEntityForUpdate(tx *bbolt.Tx, env Env, _ boltz.FieldChecker) (*db.Controller, error) { + return entity.toBoltEntity(tx, env) +} + +func (entity *Controller) fillFrom(env Env, tx *bbolt.Tx, boltController *db.Controller) error { + entity.FillCommon(boltController) + entity.Name = boltController.Name + entity.Address = boltController.Address + entity.CertPem = boltController.CertPem + entity.Fingerprint = boltController.Fingerprint + entity.IsOnline = boltController.IsOnline + entity.LastJoinedAt = boltController.LastJoinedAt + + return nil +} diff --git a/controller/model/enrollment_model.go b/controller/model/enrollment_model.go index 4696e91d6..b8a6f50cf 100644 --- a/controller/model/enrollment_model.go +++ b/controller/model/enrollment_model.go @@ -59,8 +59,15 @@ func (entity *Enrollment) FillJwtInfoWithExpiresAt(env Env, subject string, expi entity.Token = uuid.New().String() } + peerControllers := env.GetPeerControllerAddresses() + + for i, addr := range peerControllers { + peerControllers[i] = "https://" + addr + } + enrollmentClaims := &ziti.EnrollmentClaims{ EnrollmentMethod: entity.Method, + Controllers: peerControllers, RegisteredClaims: jwt.RegisteredClaims{ Audience: []string{""}, ExpiresAt: &jwt.NumericDate{Time: expiresAt}, @@ -70,7 +77,7 @@ func (entity *Enrollment) FillJwtInfoWithExpiresAt(env Env, subject string, expi }, } - signedJwt, err := env.GetJwtSigner().Generate(subject, entity.Id, enrollmentClaims) + signedJwt, err := env.GetServerJwtSigner().Generate(enrollmentClaims) if err != nil { return err diff --git a/controller/model/env.go b/controller/model/env.go index 006a131d7..8a6d29350 100644 --- a/controller/model/env.go +++ b/controller/model/env.go @@ -22,6 +22,7 @@ import ( "github.com/golang-jwt/jwt/v5" "github.com/openziti/identity" "github.com/openziti/metrics" + "github.com/openziti/ziti/common" "github.com/openziti/ziti/common/cert" "github.com/openziti/ziti/controller/config" "github.com/openziti/ziti/controller/db" @@ -33,7 +34,6 @@ import ( type Env interface { GetManagers() *Managers GetConfig() *config.Config - GetJwtSigner() jwtsigner.Signer GetDbProvider() network.DbProvider GetStores() *db.Stores GetAuthRegistry() AuthRegistry @@ -46,8 +46,17 @@ type Env interface { GetMetricsRegistry() metrics.Registry GetFingerprintGenerator() cert.FingerprintGenerator HandleServiceUpdatedEventForIdentityId(identityId string) + + GetServerJwtSigner() jwtsigner.Signer GetServerCert() (*tls.Certificate, string, jwt.SigningMethod) JwtSignerKeyFunc(token *jwt.Token) (interface{}, error) + GetPeerControllerAddresses() []string + + ValidateAccessToken(token string) (*common.AccessClaims, error) + ValidateServiceAccessToken(token string, apiSessionId *string) (*common.ServiceAccessClaims, error) + + OidcIssuer() string + RootIssuer() string } type HostController interface { @@ -57,6 +66,7 @@ type HostController interface { IsRaftEnabled() bool Identity() identity.Identity GetPeerSigners() []*x509.Certificate + GetRaftIndex() uint64 } type Schemas interface { diff --git a/controller/model/managers.go b/controller/model/managers.go index e61c90b28..32789dd8c 100644 --- a/controller/model/managers.go +++ b/controller/model/managers.go @@ -36,6 +36,7 @@ type Managers struct { Ca *CaManager Config *ConfigManager ConfigType *ConfigTypeManager + Controller *ControllerManager EdgeRouter *EdgeRouterManager EdgeRouterPolicy *EdgeRouterPolicyManager EdgeService *EdgeServiceManager @@ -72,6 +73,7 @@ func InitEntityManagers(env Env) *Managers { managers.Ca = NewCaManager(env) managers.Config = NewConfigManager(env) managers.ConfigType = NewConfigTypeManager(env) + managers.Controller = NewControllerManager(env) managers.EdgeRouter = NewEdgeRouterManager(env) managers.EdgeRouterPolicy = NewEdgeRouterPolicyManager(env) managers.EdgeService = NewEdgeServiceManager(env) diff --git a/controller/model/mfa_manager.go b/controller/model/mfa_manager.go index 3aa2250c8..121ff3500 100644 --- a/controller/model/mfa_manager.go +++ b/controller/model/mfa_manager.go @@ -21,6 +21,7 @@ import ( "encoding/base32" "fmt" "github.com/dgryski/dgoogauth" + "github.com/michaelquigley/pfxlog" "github.com/openziti/foundation/v2/errorz" "github.com/openziti/storage/boltz" "github.com/openziti/ziti/common/pb/edge_cmd_pb" @@ -61,6 +62,16 @@ func (self *MfaManager) newModelEntity() *Mfa { return &Mfa{} } +func (self *MfaManager) CreateForIdentityId(identityId string, ctx *change.Context) (string, error) { + identity, err := self.env.GetManagers().Identity.Read(identityId) + + if err != nil { + return "", err + } + + return self.CreateForIdentity(identity, ctx) +} + func (self *MfaManager) CreateForIdentity(identity *Identity, ctx *change.Context) (string, error) { secretBytes := make([]byte, 10) _, _ = rand.Read(secretBytes) @@ -303,6 +314,37 @@ func (self *MfaManager) DeleteAllForIdentity(id string, ctx *change.Context) err }) } +func (self *MfaManager) CompleteTotpEnrollment(identityId string, code string, changeCtx *change.Context) error { + mfa, err := self.ReadOneByIdentityId(identityId) + + if err != nil { + return err + } + + if mfa == nil || mfa.IsVerified { + return errorz.NewNotFound() + } + + ok, err := self.VerifyTOTP(mfa, code) + + if err != nil { + pfxlog.Logger().WithError(err).Error("could not verify TOTP code") + return apierror.NewInvalidMfaTokenError() + } + + if !ok { + return apierror.NewInvalidMfaTokenError() + } + + mfa.IsVerified = true + if err := self.Update(mfa, nil, changeCtx); err != nil { + pfxlog.Logger().Errorf("could not update MFA with new MFA status: %v", err) + return errors.New("could not update MFA status") + } + + return nil +} + type MfaListResult struct { manager *MfaManager Mfas []*Mfa diff --git a/controller/model/service_policy_manager.go b/controller/model/service_policy_manager.go index 08776bcca..9e8d39d0f 100644 --- a/controller/model/service_policy_manager.go +++ b/controller/model/service_policy_manager.go @@ -25,6 +25,7 @@ import ( "github.com/openziti/ziti/controller/fields" "github.com/openziti/ziti/controller/models" "github.com/openziti/ziti/controller/network" + "go.etcd.io/bbolt" "google.golang.org/protobuf/proto" ) @@ -103,3 +104,17 @@ func (self *ServicePolicyManager) Unmarshall(bytes []byte) (*ServicePolicy, erro PolicyType: msg.PolicyType, }, nil } + +type AssociatedIdsResult struct { + ServiceIds []string + IdentityIds []string + PostureCheckIds []string +} + +func (self *ServicePolicyManager) ListAssociatedIds(tx *bbolt.Tx, id string) *AssociatedIdsResult { + return &AssociatedIdsResult{ + IdentityIds: self.env.GetStores().ServicePolicy.GetRelatedEntitiesIdList(tx, id, db.EntityTypeIdentities), + ServiceIds: self.env.GetStores().ServicePolicy.GetRelatedEntitiesIdList(tx, id, db.EntityTypeServicePolicies), + PostureCheckIds: self.env.GetStores().ServicePolicy.GetRelatedEntitiesIdList(tx, id, db.EntityTypePostureChecks), + } +} diff --git a/controller/model/session_manager.go b/controller/model/session_manager.go index 371af19bb..6a86e8b18 100644 --- a/controller/model/session_manager.go +++ b/controller/model/session_manager.go @@ -18,11 +18,14 @@ package model import ( "fmt" + "github.com/golang-jwt/jwt/v5" + "github.com/google/uuid" "github.com/lucsky/cuid" "github.com/openziti/foundation/v2/errorz" "github.com/openziti/foundation/v2/stringz" "github.com/openziti/storage/ast" "github.com/openziti/storage/boltz" + "github.com/openziti/ziti/common" "github.com/openziti/ziti/controller/apierror" fabricApiError "github.com/openziti/ziti/controller/apierror" "github.com/openziti/ziti/controller/change" @@ -151,6 +154,61 @@ func (self *SessionManager) EvaluatePostureForService(identityId, apiSessionId, } } +func (self *SessionManager) CreateJwt(entity *Session, ctx *change.Context) (string, error) { + entity.Id = uuid.New().String() + + service, err := self.GetEnv().GetManagers().EdgeService.ReadForIdentity(entity.ServiceId, entity.IdentityId, nil) + if err != nil { + return "", err + } + + if entity.Type == "" { + entity.Type = db.SessionTypeDial + } + + if db.SessionTypeDial == entity.Type && !stringz.Contains(service.Permissions, db.PolicyTypeDialName) { + return "", errorz.NewFieldError("service not found", "ServiceId", entity.ServiceId) + } + + if db.SessionTypeBind == entity.Type && !stringz.Contains(service.Permissions, db.PolicyTypeBindName) { + return "", errorz.NewFieldError("service not found", "ServiceId", entity.ServiceId) + } + + policyResult := self.EvaluatePostureForService(entity.IdentityId, entity.ApiSessionId, entity.Type, service.Id, service.Name) + + if !policyResult.Passed { + self.env.GetManagers().PostureResponse.postureCache.AddSessionRequestFailure(entity.IdentityId, policyResult.Failure) + return "", apierror.NewInvalidPosture(policyResult.Cause) + } + + edgeRouterAvailable, err := self.GetEnv().GetManagers().EdgeRouter.IsSharedEdgeRouterPresent(entity.IdentityId, entity.ServiceId) + if err != nil { + return "", err + } + + if !edgeRouterAvailable { + return "", apierror.NewNoEdgeRoutersAvailable() + } + entity.ServicePolicies = policyResult.PassingPolicyIds + + claims := common.ServiceAccessClaims{ + RegisteredClaims: jwt.RegisteredClaims{ + Issuer: self.env.RootIssuer(), + Subject: entity.ServiceId, + Audience: jwt.ClaimStrings{common.ClaimAudienceOpenZiti}, + IssuedAt: &jwt.NumericDate{Time: time.Now()}, + ID: entity.Id, + ExpiresAt: &jwt.NumericDate{Time: time.Now().AddDate(1, 0, 0)}, //bound by API Session + }, + ApiSessionId: entity.ApiSessionId, + IdentityId: entity.IdentityId, + Type: entity.Type, + TokenType: common.TokenTypeServiceAccess, + } + + return self.env.GetServerJwtSigner().Generate(claims) +} + func (self *SessionManager) Create(entity *Session, ctx *change.Context) (string, error) { if self.getExistingSessionEntity(entity) { return entity.Id, nil @@ -194,6 +252,7 @@ func (self *SessionManager) Create(entity *Session, ctx *change.Context) (string if err != nil { return "", err } + if !edgeRouterAvailable { return "", apierror.NewNoEdgeRoutersAvailable() } diff --git a/controller/model/testing.go b/controller/model/testing.go index d8f77c007..cfc74379f 100644 --- a/controller/model/testing.go +++ b/controller/model/testing.go @@ -19,23 +19,26 @@ package model import ( "crypto/tls" "crypto/x509" + "testing" + "time" + "github.com/golang-jwt/jwt/v5" "github.com/google/uuid" "github.com/openziti/foundation/v2/versions" "github.com/openziti/identity" "github.com/openziti/metrics" "github.com/openziti/storage/boltz" + "github.com/openziti/ziti/common" "github.com/openziti/ziti/common/cert" "github.com/openziti/ziti/common/eid" "github.com/openziti/ziti/controller/change" "github.com/openziti/ziti/controller/command" "github.com/openziti/ziti/controller/config" + edgeconfig "github.com/openziti/ziti/controller/config" "github.com/openziti/ziti/controller/db" "github.com/openziti/ziti/controller/event" "github.com/openziti/ziti/controller/jwtsigner" "github.com/openziti/ziti/controller/network" - "testing" - "time" ) var _ Env = &TestContext{} @@ -47,6 +50,10 @@ type testHostController struct { ctx *TestContext } +func (self *testHostController) GetRaftIndex() uint64 { + return 0 +} + func (self *testHostController) GetPeerSigners() []*x509.Certificate { return nil } @@ -79,7 +86,7 @@ type TestContext struct { *db.TestContext n *network.Network managers *Managers - config *config.Config + config *edgeconfig.Config metricsRegistry metrics.Registry hostController *testHostController } @@ -88,6 +95,38 @@ func (ctx *TestContext) GetDbProvider() network.DbProvider { return ctx.n } +func (ctx *TestContext) ValidateAccessToken(token string) (*common.AccessClaims, error) { + //TODO implement me + panic("implement me") +} + +func (ctx *TestContext) ValidateServiceAccessToken(token string, apiSessionId *string) (*common.ServiceAccessClaims, error) { + //TODO implement me + panic("implement me") +} + +func (ctx *TestContext) OidcIssuer() string { + //TODO implement me + panic("implement me") +} + +func (ctx *TestContext) RootIssuer() string { + //TODO implement me + panic("implement me") +} + +func (ctx *TestContext) GetPeerControllerAddresses() []string { + return nil +} + +func (ctx *TestContext) SigningMethod() jwt.SigningMethod { + return nil +} + +func (ctx *TestContext) KeyId() string { + return "123-test-context" +} + func (ctx *TestContext) JwtSignerKeyFunc(*jwt.Token) (interface{}, error) { tlsCert, _, _ := ctx.GetServerCert() return tlsCert.Leaf.PublicKey, nil @@ -99,7 +138,7 @@ func (ctx *TestContext) GetServerCert() (*tls.Certificate, string, jwt.SigningMe func (ctx *TestContext) HandleServiceUpdatedEventForIdentityId(string) {} -func (ctx *TestContext) Generate(string, string, jwt.Claims) (string, error) { +func (ctx *TestContext) Generate(jwt.Claims) (string, error) { return "I'm a very legitimate claim", nil } @@ -107,11 +146,11 @@ func (ctx *TestContext) GetManagers() *Managers { return ctx.managers } -func (ctx *TestContext) GetConfig() *config.Config { +func (ctx *TestContext) GetConfig() *edgeconfig.Config { return ctx.config } -func (ctx *TestContext) GetJwtSigner() jwtsigner.Signer { +func (ctx *TestContext) GetServerJwtSigner() jwtsigner.Signer { return ctx } diff --git a/controller/oidc_auth/client.go b/controller/oidc_auth/client.go index 0f9885c3f..f1d92289d 100644 --- a/controller/oidc_auth/client.go +++ b/controller/oidc_auth/client.go @@ -40,6 +40,16 @@ func (c *Client) PostLogoutRedirectURIs() []string { return c.postLogoutRedirectURIs } +// RedirectURIGlobs must return the registered redirect_uris for Code and Implicit Flow that match via path.Match +func (c *Client) RedirectURIGlobs() []string { + return c.redirectURIs +} + +// PostLogoutRedirectURIGlobs must return the registered post_logout_redirect_uris for sign-outs that match via path.Math +func (c *Client) PostLogoutRedirectURIGlobs() []string { + return []string{} +} + // ApplicationType returns the application type (app, native, user agent), implements op.Client func (c *Client) ApplicationType() op.ApplicationType { return c.applicationType diff --git a/controller/oidc_auth/config.go b/controller/oidc_auth/config.go index 5cb31744a..6790f1930 100644 --- a/controller/oidc_auth/config.go +++ b/controller/oidc_auth/config.go @@ -4,6 +4,7 @@ import ( "crypto" "crypto/sha256" "crypto/x509" + "github.com/openziti/ziti/common" "time" ) @@ -29,9 +30,9 @@ func NewConfig(issuer string, cert *x509.Certificate, key crypto.PrivateKey) Con Issuer: issuer, Certificate: cert, PrivateKey: key, - RefreshTokenDuration: DefaultRefreshTokenDuration, - AccessTokenDuration: DefaultAccessTokenDuration, - IdTokenDuration: DefaultIdTokenDuration, + RefreshTokenDuration: common.DefaultRefreshTokenDuration, + AccessTokenDuration: common.DefaultAccessTokenDuration, + IdTokenDuration: common.DefaultIdTokenDuration, } } diff --git a/controller/oidc_auth/ctx.go b/controller/oidc_auth/ctx.go index 832b9ba2b..53de6c5ce 100644 --- a/controller/oidc_auth/ctx.go +++ b/controller/oidc_auth/ctx.go @@ -2,6 +2,8 @@ package oidc_auth import ( "context" + "fmt" + "github.com/openziti/ziti/common" "github.com/openziti/ziti/controller/change" "github.com/zitadel/oidc/v2/pkg/oidc" "net/http" @@ -12,6 +14,7 @@ type contextKey string // contextKeyHttpRequest is the key value to retrieve the current http.Request from a context const contextKeyHttpRequest contextKey = "oidc_request" +const contextKeyTokenState contextKey = "oidc_token_state" // NewChangeCtx creates a change.Context scoped to oidc_auth package func NewChangeCtx() *change.Context { @@ -34,6 +37,31 @@ func NewHttpChangeCtx(r *http.Request) *change.Context { return ctx } +type TokenState struct { + AccessClaims *common.AccessClaims + RefreshClaims *common.RefreshClaims +} + +func TokenStateFromContext(ctx context.Context) (*TokenState, error) { + val := ctx.Value(contextKeyTokenState) + + if val == nil { + srvErr := oidc.ErrServerError() + srvErr.Description = "token state context was nil" + return nil, srvErr + } + + tokenState := val.(*TokenState) + + if tokenState == nil { + srvErr := oidc.ErrServerError() + srvErr.Description = fmt.Sprintf("could not cast token state context value from %T to %T", val, tokenState) + return nil, srvErr + } + + return tokenState, nil +} + // HttpRequestFromContext returns the initiating http.Request for the current OIDC context func HttpRequestFromContext(ctx context.Context) (*http.Request, error) { httpVal := ctx.Value(contextKeyHttpRequest) diff --git a/controller/oidc_auth/errors.go b/controller/oidc_auth/errors.go new file mode 100644 index 000000000..2d73e2264 --- /dev/null +++ b/controller/oidc_auth/errors.go @@ -0,0 +1,13 @@ +package oidc_auth + +import ( + "fmt" + "github.com/openziti/foundation/v2/errorz" +) + +func newNotAcceptableError(acceptHeader string) *errorz.ApiError { + return &errorz.ApiError{ + Code: "NOT_ACCEPTABLE", + Message: fmt.Sprintf("the request is not acceptable, the accept header did not have any supported options: %s (supported: %s, %s)", acceptHeader, JsonContentType, HtmlContentType), + } +} diff --git a/controller/oidc_auth/login.go b/controller/oidc_auth/login.go index 6af7d56a7..43590fd14 100644 --- a/controller/oidc_auth/login.go +++ b/controller/oidc_auth/login.go @@ -3,12 +3,15 @@ package oidc_auth import ( "context" "embed" + "encoding/json" "fmt" + "github.com/openziti/edge-api/rest_model" "github.com/openziti/ziti/controller/apierror" "github.com/openziti/ziti/controller/model" "github.com/pkg/errors" "github.com/zitadel/oidc/v2/pkg/op" "html/template" + "io" "net/http" "strings" "time" @@ -27,9 +30,16 @@ const ( passwordLoginUrl = "/oidc/login/username?authRequestID=" certLoginUrl = "/oidc/login/cert?authRequestID=" extJwtLoginUrl = "/oidc/login/ext-jwt?authRequestID=" -) -const () + AuthRequestIdHeader = "auth-request-id" + AcceptHeader = "accept" + TotpRequiredHeader = "totp-required" + ContentTypeHeader = "content-type" + + FormContentType = "application/x-www-form-urlencoded" + JsonContentType = "application/json" + HtmlContentType = "text/html" +) // embedded file/HTML resources var ( @@ -97,11 +107,33 @@ func newLogin(store Storage, callback func(context.Context, string) string, issu func (l *login) createRouter(issuerInterceptor *op.IssuerInterceptor) { l.router = mux.NewRouter() + l.router.Path("/password").Methods("GET").HandlerFunc(l.loginHandler) + l.router.Path("/password").Methods("POST").HandlerFunc(issuerInterceptor.HandlerFunc(l.authenticate)) + l.router.Path("/username").Methods("GET").HandlerFunc(l.loginHandler) l.router.Path("/username").Methods("POST").HandlerFunc(issuerInterceptor.HandlerFunc(l.authenticate)) + + l.router.Path("/cert").Methods("GET").HandlerFunc(issuerInterceptor.HandlerFunc(l.genericHandler)) l.router.Path("/cert").Methods("POST").HandlerFunc(issuerInterceptor.HandlerFunc(l.authenticate)) + + l.router.Path("/ext-jwt").Methods("GET").HandlerFunc(issuerInterceptor.HandlerFunc(l.genericHandler)) l.router.Path("/ext-jwt").Methods("POST").HandlerFunc(issuerInterceptor.HandlerFunc(l.authenticate)) + l.router.Path("/totp").Methods("POST").HandlerFunc(l.checkTotp) + l.router.Path("/totp/enroll").Methods("POST").HandlerFunc(l.startEnrollTotp) + l.router.Path("/totp/enroll/verify").Methods("POST").HandlerFunc(l.completeTotpEnrollment) +} + +func (l *login) genericHandler(w http.ResponseWriter, r *http.Request) { + err := r.ParseForm() + if err != nil { + http.Error(w, fmt.Sprintf("cannot parse form:%s", err), http.StatusInternalServerError) + return + } + + id := r.FormValue(queryAuthRequestID) + w.Header().Set(AuthRequestIdHeader, id) + _, _ = w.Write([]byte("please POST to this URL")) } func (l *login) loginHandler(w http.ResponseWriter, r *http.Request) { @@ -111,7 +143,9 @@ func (l *login) loginHandler(w http.ResponseWriter, r *http.Request) { return } - renderLogin(w, r.FormValue(queryAuthRequestID), nil) + id := r.FormValue(queryAuthRequestID) + w.Header().Set(AuthRequestIdHeader, id) + renderLogin(w, id, nil) } func renderLogin(w http.ResponseWriter, id string, err error) { @@ -146,18 +180,51 @@ func renderPage(w http.ResponseWriter, pageTemplate *template.Template, id strin } func (l *login) checkTotp(w http.ResponseWriter, r *http.Request) { - err := r.ParseForm() + responseType, err := negotiateResponseContentType(r) + if err != nil { - http.Error(w, fmt.Sprintf("cannot parse form:%s", err), http.StatusInternalServerError) - return + renderJsonApiError(w, err) } - id := r.FormValue("id") - code := r.FormValue("code") - ctx := NewHttpChangeCtx(r) - authRequest, err := l.store.VerifyTotp(ctx, code, id) + bodyContentType, err := negotiateBodyContentType(r) if err != nil { + renderJsonApiError(w, err) + } + + id := "" + code := "" + if bodyContentType == FormContentType { + err := r.ParseForm() + if err != nil { + http.Error(w, fmt.Sprintf("cannot parse form:%s", err), http.StatusInternalServerError) + return + } + id = r.FormValue("id") + code = r.FormValue("code") + } else if bodyContentType == JsonContentType { + payload := &Totp{} + body, err := io.ReadAll(r.Body) + + if err != nil { + renderJsonError(w, err) + return + } + err = json.Unmarshal(body, payload) + + if err != nil { + renderJsonError(w, err) + return + } + + id = payload.GetAuthRequestId() + code = payload.Code + } + + ctx := NewHttpChangeCtx(r) + authRequest, verifyErr := l.store.VerifyTotp(ctx, code, id) + + if verifyErr != nil { renderTotp(w, id, err) return } @@ -166,24 +233,18 @@ func (l *login) checkTotp(w http.ResponseWriter, r *http.Request) { renderTotp(w, id, errors.New("invalid TOTP code")) } - http.Redirect(w, r, l.callback(r.Context(), id), http.StatusFound) -} - -func (l *login) authenticate(w http.ResponseWriter, r *http.Request) { - err := r.ParseForm() - if err != nil { - http.Error(w, fmt.Sprintf("cannot parse form:%s", err), http.StatusInternalServerError) - return + if responseType == HtmlContentType { + http.Redirect(w, r, l.callback(r.Context(), id), http.StatusFound) } - username := r.FormValue("username") - password := r.FormValue("password") - configTypes := r.Form["configTypes"] + renderJson(w, http.StatusOK, &rest_model.Empty{}) +} - id := r.FormValue("id") +func (l *login) authenticate(w http.ResponseWriter, r *http.Request) { + responseType, err := negotiateResponseContentType(r) - if id == "" { - id = r.URL.Query().Get("id") + if err != nil { + renderJsonError(w, err) } pathSplits := strings.Split(r.URL.Path, "/") @@ -195,22 +256,27 @@ func (l *login) authenticate(w http.ResponseWriter, r *http.Request) { method := pathSplits[len(pathSplits)-1] + //patch username from standard OIDC auth URIs if method == "username" { method = AuthMethodPassword } - authCtx := model.NewAuthContextHttp(r, method, map[string]any{ - "username": username, - "password": password, - "configTypes": configTypes, - }, NewHttpChangeCtx(r)) + credentials := &updbCreds{} + apiErr := parsePayload(r, credentials) - authRequest, err := l.store.Authenticate(authCtx, id, configTypes) + if apiErr != nil { + renderJsonError(w, err) + return + } - if err != nil { + authCtx := model.NewAuthContextHttp(r, method, credentials, NewHttpChangeCtx(r)) + + authRequest, apiErr := l.store.Authenticate(authCtx, credentials.AuthRequestId, credentials.ConfigTypes) + + if apiErr != nil { invalid := apierror.NewInvalidAuth() if method == AuthMethodPassword { - renderLogin(w, id, invalid) + renderLogin(w, credentials.AuthRequestId, invalid) return } @@ -219,11 +285,74 @@ func (l *login) authenticate(w http.ResponseWriter, r *http.Request) { } if authRequest.SecondaryTotpRequired && !authRequest.HasAmr(AuthMethodSecondaryTotp) { - renderTotp(w, id, err) + w.Header().Set(TotpRequiredHeader, "true") + if responseType == HtmlContentType { + renderTotp(w, credentials.AuthRequestId, err) + } else if responseType == JsonContentType { + renderJson(w, http.StatusOK, &rest_model.Empty{}) + } + return } authRequest.AuthTime = time.Now() + authRequest.SdkInfo = credentials.SdkInfo + authRequest.EnvInfo = credentials.EnvInfo + + callbackUrl := l.callback(r.Context(), credentials.AuthRequestId) + http.Redirect(w, r, callbackUrl, http.StatusFound) +} + +func (l *login) startEnrollTotp(w http.ResponseWriter, r *http.Request) { + changeCtx := NewHttpChangeCtx(r) + + _, err := negotiateResponseContentType(r) + + if err != nil { + renderJsonError(w, err) + return + } + + payload := &AuthRequestBody{} + apiErr := parsePayload(r, payload) + + if apiErr != nil { + renderJsonError(w, apiErr) + return + } + + _, apiErr = l.store.StartTotpEnrollment(changeCtx, payload.AuthRequestId) + + if apiErr != nil { + renderJsonError(w, apiErr) + } + + renderJson(w, http.StatusOK, &rest_model.Empty{}) +} + +func (l *login) completeTotpEnrollment(w http.ResponseWriter, r *http.Request) { + changeCtx := NewHttpChangeCtx(r) + + _, err := negotiateResponseContentType(r) + + if err != nil { + renderJsonError(w, err) + return + } + + payload := &Totp{} + apiErr := parsePayload(r, payload) + + if apiErr != nil { + renderJsonError(w, err) + return + } + + apiErr = l.store.CompleteTotpEnrollment(changeCtx, payload.Code, payload.AuthRequestId) + + if apiErr != nil { + renderJsonError(w, apiErr) + } - http.Redirect(w, r, l.callback(r.Context(), id), http.StatusFound) + renderJson(w, http.StatusOK, &rest_model.Empty{}) } diff --git a/controller/oidc_auth/negotiate.go b/controller/oidc_auth/negotiate.go new file mode 100644 index 000000000..87a81ba42 --- /dev/null +++ b/controller/oidc_auth/negotiate.go @@ -0,0 +1,71 @@ +package oidc_auth + +import ( + "fmt" + "github.com/openziti/foundation/v2/errorz" + "net/http" + "strings" +) + +// negotiateResponseContentType returns the response content type that should be +// used based on the results of parseAcceptHeader. If the accept header +// cannot be satisfied an error is returned. +func negotiateResponseContentType(r *http.Request) (string, *errorz.ApiError) { + acceptHeader := r.Header.Get(AcceptHeader) + contentTypes := parseAcceptHeader(acceptHeader) + + if len(contentTypes) == 0 || acceptHeader == "" { + return JsonContentType, nil + } + + for _, contentType := range contentTypes { + if contentType == JsonContentType { + return contentType, nil + } else if contentType == HtmlContentType { + return HtmlContentType, nil + } + } + + return "", &errorz.ApiError{ + Code: "NOT_ACCEPTABLE", + Message: fmt.Sprintf("unable to satisfy accept header provided: %s. Supported headers include %s and %s", acceptHeader, JsonContentType, HtmlContentType), + Status: http.StatusNotAcceptable, + Cause: nil, + AppendCause: false, + } +} + +func negotiateBodyContentType(r *http.Request) (string, *errorz.ApiError) { + contentType := r.Header.Get(ContentTypeHeader) + + switch contentType { + case FormContentType: + return FormContentType, nil + case JsonContentType: + return JsonContentType, nil + } + + return "", &errorz.ApiError{ + + Code: "UNSUPPORTED_MEDIA_TYPE", + Message: fmt.Sprintf("the content type: %s, is not supported (supported: %s, %s)", contentType, FormContentType, JsonContentType), + Status: 0, + Cause: nil, + AppendCause: false, + } +} + +// parseAcceptHeader parses HTTP accept headers and returns an array of supported +// content types sorted by quality factor (0=most desired response type). The return +// strings are the content type only (e.g. "application/json") +func parseAcceptHeader(acceptHeader string) []string { + parts := strings.Split(acceptHeader, ",") + contentTypes := make([]string, len(parts)) + + for i, part := range parts { + typeAndFactor := strings.Split(strings.TrimSpace(part), ";") + contentTypes[i] = typeAndFactor[0] + } + + return contentTypes +} diff --git a/controller/oidc_auth/parse.go b/controller/oidc_auth/parse.go new file mode 100644 index 000000000..e31c246fc --- /dev/null +++ b/controller/oidc_auth/parse.go @@ -0,0 +1,233 @@ +package oidc_auth + +import ( + "encoding/json" + "fmt" + "github.com/openziti/edge-api/rest_model" + "github.com/openziti/foundation/v2/errorz" + "io" + "net/http" + "reflect" + "strings" + "unicode/utf8" +) + +type Totp struct { + AuthRequestBody + Code string `json:"code"` +} + +type updbCreds struct { + rest_model.Authenticate + AuthRequestBody +} + +func (u *updbCreds) Translate(in string, paths ...string) (string, bool) { + if len(paths) > 0 { + last := paths[len(paths)-1:][0] + + switch last { + case "EnvInfo": + return "env" + upperCaseInitial(in), true + case "SdkInfo": + return "sdk" + upperCaseInitial(in), true + } + } + return "", false +} + +type AuthRequestBody struct { + AuthRequestId string `json:"id"` +} + +func (a AuthRequestBody) SetAuthRequestId(id string) { + a.AuthRequestId = id +} + +func (a AuthRequestBody) GetAuthRequestId() string { + return a.AuthRequestId +} + +var _ AuthRequestIdHolder = (*AuthRequestBody)(nil) + +type AuthRequestIdHolder interface { + SetAuthRequestId(string) + GetAuthRequestId() string +} + +type FieldTranslator interface { + Translate(string, ...string) (string, bool) +} + +func MapToStruct(m map[string][]string, dst interface{}) error { + translator, _ := dst.(FieldTranslator) + return mapToStruct(0, m, dst, translator) +} + +func mapToStruct(depth int, src map[string][]string, dst interface{}, translator FieldTranslator, paths ...string) error { + if paths == nil { + paths = []string{} + } + + rv := reflect.ValueOf(dst) + if rv.Kind() != reflect.Ptr || rv.Elem().Kind() != reflect.Struct { + return fmt.Errorf("expected a pointer to a struct") + } + + rv = rv.Elem() + rt := rv.Type() + + for i := 0; i < rv.NumField(); i++ { + field := rv.Field(i) + fieldType := rt.Field(i) + fieldName := fieldType.Name + + tagValue := fieldType.Tag.Get("json") + tagVals := strings.Split(tagValue, ",") + + if len(tagVals) == 0 { + tagVals = []string{""} + } + if tagVals[0] == "-" { + continue + } + + if field.Kind() == reflect.Struct { + fieldPtr := field.Addr().Interface() + + newPaths := make([]string, len(paths)) + copy(newPaths, paths) + + if depth > 0 { + newPaths = append(newPaths, fieldName) + } + + err := mapToStruct(depth+1, src, fieldPtr, translator, newPaths...) + if err != nil { + return err + } + continue + } else if field.Kind() == reflect.Ptr && field.Type().Elem().Kind() == reflect.Struct { + var fieldPtr interface{} + + newPaths := make([]string, len(paths)) + copy(newPaths, paths) + + if depth > 0 { + newPaths = append(newPaths, fieldName) + } + + if !field.IsNil() { + fieldPtr = field.Interface() + } else { + // Initialize the nil pointer to a new struct before proceeding + newStruct := reflect.New(field.Type().Elem()) + field.Set(newStruct) + fieldPtr = newStruct.Interface() + } + + err := mapToStruct(depth+1, src, fieldPtr, translator, newPaths...) + if err != nil { + return err + } + continue + } + + var mapValue []string + var ok bool + + if tagVals[0] != "" { + if translator != nil { + translation, translatedOk := translator.Translate(tagVals[0], paths...) + if translatedOk { + mapValue, ok = src[translation] + } else { + mapValue, ok = src[tagVals[0]] + } + } else { + mapValue, ok = src[tagVals[0]] + } + } + if !ok { + mapValue, ok = src[fieldType.Name] + } + + if !ok || len(mapValue) == 0 { + continue + } + + switch field.Kind() { + case reflect.String: + if len(mapValue) > 0 { + field.SetString(mapValue[0]) + } + case reflect.Slice: + if fieldType.Type.Elem().Kind() == reflect.String { + field.Set(reflect.ValueOf(mapValue)) + } + default: + panic("unhandled default case") + } + } + + return nil +} + +func parsePayload(r *http.Request, out AuthRequestIdHolder) error { + contentType, err := negotiateBodyContentType(r) + + if err != nil { + return err + } + + if contentType == FormContentType { + err := r.ParseForm() + if err != nil { + return fmt.Errorf("cannot parse form: %s", err) + } + + err = MapToStruct(r.Form, out) + + if err != nil { + return err + } + + return nil + + } else if contentType == JsonContentType { + body, err := io.ReadAll(r.Body) + + if err != nil { + return err + } + + err = json.Unmarshal(body, out) + + if err != nil { + return err + } + } else { + return &errorz.ApiError{ + Code: "UNSUPPORTED_MEDIA_TYPE", + Message: fmt.Sprintf("the content type: %s, is not supported (supported: %s, %s)", contentType, FormContentType, JsonContentType), + Status: http.StatusUnsupportedMediaType, + Cause: nil, + AppendCause: false, + } + } + + if out.GetAuthRequestId() == "" { + out.SetAuthRequestId(r.URL.Query().Get("id")) + } + + return nil +} + +func upperCaseInitial(in string) string { + if in != "" { + r, size := utf8.DecodeRuneInString(in) + return strings.ToUpper(string(r)) + in[size:] + } + + return "" +} diff --git a/controller/oidc_auth/parse_test.go b/controller/oidc_auth/parse_test.go new file mode 100644 index 000000000..799eb42cc --- /dev/null +++ b/controller/oidc_auth/parse_test.go @@ -0,0 +1,89 @@ +package oidc_auth + +import ( + "github.com/stretchr/testify/require" + "testing" +) + +func Test_Map(t *testing.T) { + + const ( + id = "123" + envArch = "x64" + envOs = "linux" + envOsRelease = "11" + envOsVersion = "1.1.1" + sdkAppId = "myAppid" + sdkAppVersion = "5.1.1" + sdkBranch = "branch34" + sdkRevision = "rev1" + sdkType = "fakeType" + sdkVersion = "6.4.3" + username = "admin" + password = "fake_admin_password" + configType1 = "one" + configType2 = "two" + ) + + t.Run("totp id/code payload", func(t *testing.T) { + dstTotp := &Totp{} + + srcMap := map[string][]string{ + "id": {"123"}, + "code": {"456"}, + } + err := MapToStruct(srcMap, dstTotp) + + req := require.New(t) + req.NoError(err) + req.Equal(dstTotp.Code, "456") + req.Equal(dstTotp.AuthRequestId, "123") + }) + + t.Run("updb creds with env/sdk info payload", func(t *testing.T) { + srcMap := map[string][]string{ + "id": {id}, + "envArch": {envArch}, + "envOs": {envOs}, + "envOsRelease": {envOsRelease}, + "envOsVersion": {envOsVersion}, + "sdkAppId": {sdkAppId}, + "sdkAppVersion": {sdkAppVersion}, + "sdkBranch": {sdkBranch}, + "sdkRevision": {sdkRevision}, + "sdkType": {sdkType}, + "sdkVersion": {sdkVersion}, + "username": {username}, + "password": {password}, + "configTypes": {"one", "two"}, + } + + dst := &updbCreds{} + + err := MapToStruct(srcMap, dst) + + req := require.New(t) + req.NoError(err) + req.Equal(dst.AuthRequestId, id) + req.NotNil(dst.EnvInfo) + req.Equal(dst.EnvInfo.Arch, envArch) + req.Equal(dst.EnvInfo.OsVersion, envOsVersion) + req.Equal(dst.EnvInfo.OsRelease, envOsRelease) + req.Equal(dst.EnvInfo.Os, envOs) + req.NotNil(dst.SdkInfo) + req.Equal(dst.SdkInfo.AppID, sdkAppId) + req.Equal(dst.SdkInfo.AppVersion, sdkAppVersion) + req.Equal(dst.SdkInfo.Type, sdkType) + req.Equal(dst.SdkInfo.Revision, sdkRevision) + req.Equal(dst.SdkInfo.Branch, sdkBranch) + req.Equal(string(dst.Username), username) + req.Equal(string(dst.Password), password) + req.NotNil(dst.ConfigTypes) + req.Equal(dst.ConfigTypes[0], configType1) + req.Equal(dst.ConfigTypes[1], configType2) + }) + + // test - operator + // test nil translator + // test bad field names in translator +} diff --git a/controller/oidc_auth/provider.go b/controller/oidc_auth/provider.go index 47dafbb3a..5f7b044cd 100644 --- a/controller/oidc_auth/provider.go +++ b/controller/oidc_auth/provider.go @@ -47,7 +47,7 @@ func NewNativeOnlyOP(ctx context.Context, env model.Env, config Config) (http.Ha return http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) { r := request.WithContext(context.WithValue(request.Context(), contextKeyHttpRequest, request)) - + r = request.WithContext(context.WithValue(r.Context(), contextKeyTokenState, &TokenState{})) oidcHandler.ServeHTTP(writer, r) }), nil diff --git a/controller/oidc_auth/render.go b/controller/oidc_auth/render.go new file mode 100644 index 000000000..abdfc3e7e --- /dev/null +++ b/controller/oidc_auth/render.go @@ -0,0 +1,102 @@ +package oidc_auth + +import ( + "encoding" + "errors" + "fmt" + "github.com/michaelquigley/pfxlog" + "github.com/openziti/edge-api/rest_model" + "github.com/openziti/foundation/v2/errorz" + "net/http" +) + +// render will attempt to send a responses on the provided http.ResponseWriter. All error output will be directed to the +// http.ResponseWriter. The provided http.ResponseWriter will have had its header sent after calling this function. +func render(w http.ResponseWriter, contentType string, status int, data encoding.BinaryMarshaler) { + payload, err := data.MarshalBinary() + + if err != nil { + pfxlog.Logger().WithError(err).Error("could not marshal data payload, attempting to respond with a marshalling error") + internalErr := &rest_model.APIError{ + Code: errorz.UnhandledCode, + Message: fmt.Sprintf("could not marhsal, see cause"), + Cause: &rest_model.APIErrorCause{ + APIError: rest_model.APIError{ + Code: "UNHANDLED", + Message: err.Error(), + }, + }, + } + + // if there is an err here, we are giving up as we have already tried to recover. + internalErrPayload, internalErrMarshalErr := internalErr.MarshalBinary() + + if err != nil { + pfxlog.Logger().WithError(internalErrMarshalErr).Error("could not write marshaling error, failed to marshal internal error, writing '{}'") + } + + if len(internalErrPayload) == 0 { + internalErrPayload = []byte("{}") + } + + w.Header().Set(ContentTypeHeader, contentType) + w.WriteHeader(http.StatusInternalServerError) + + _, err = w.Write(internalErrPayload) + return + } + + w.Header().Set(ContentTypeHeader, contentType) + w.WriteHeader(status) + _, err = w.Write(payload) + + if err != nil { + pfxlog.Logger().WithError(err).Error("error writing payload") + } +} + +// renderJson will attempt to render the provided data as JSON. +func renderJson(w http.ResponseWriter, status int, data encoding.BinaryMarshaler) { + render(w, JsonContentType, status, data) +} + +// renderJson will attempt to render the provided data as text/html. +func renderHtml(w http.ResponseWriter, status int, data encoding.BinaryMarshaler) { + render(w, HtmlContentType, status, data) +} + +func renderJsonError(w http.ResponseWriter, err error) { + restErr, status := errorToRestApiError(err) + renderJson(w, status, restErr) +} + +func renderJsonApiError(w http.ResponseWriter, err *errorz.ApiError) { + restErr, status := errorToRestApiError(err) + renderJson(w, status, restErr) +} + +func errorToRestApiError(err error) (*rest_model.APIError, int) { + var typedErr *errorz.ApiError + switch { + case errors.As(err, &typedErr): + restErr := &rest_model.APIError{ + Code: typedErr.Code, + Message: typedErr.Message, + } + + if typedErr.Cause != nil { + causeErr, _ := errorToRestApiError(typedErr.Cause) + restErr.Cause = &rest_model.APIErrorCause{ + APIError: *causeErr, + } + } + + return restErr, typedErr.Status + default: + return &rest_model.APIError{ + Code: "UNHANDLED", + Message: err.Error(), + }, http.StatusInternalServerError + } + +} diff --git a/controller/oidc_auth/requests.go b/controller/oidc_auth/requests.go index 5a63cb016..2fbc1c7f3 100644 --- a/controller/oidc_auth/requests.go +++ b/controller/oidc_auth/requests.go @@ -4,6 +4,8 @@ import ( "crypto/sha1" "crypto/x509" "fmt" + "github.com/openziti/edge-api/rest_model" + "github.com/openziti/ziti/common" "time" "github.com/zitadel/oidc/v2/pkg/oidc" @@ -31,6 +33,9 @@ type AuthRequest struct { PeerCerts []*x509.Certificate RequestedMethod string BearerTokenDetected bool + SdkInfo *rest_model.SdkInfo + EnvInfo *rest_model.EnvInfo + RemoteAddress string } // GetID returns an AuthRequest's ID and implements op.AuthRequest @@ -87,7 +92,7 @@ func (a *AuthRequest) AddAmr(amr string) { // GetAudience returns all current audience targets and implements op.AuthRequest func (a *AuthRequest) GetAudience() []string { - return []string{a.ClientID, ClaimAudienceOpenZiti} + return []string{a.ClientID, common.ClaimAudienceOpenZiti} } // GetAuthTime returns the time at which authentication has occurred and implements op.AuthRequest @@ -157,7 +162,7 @@ func (a *AuthRequest) GetCertFingerprints() []string { var prints []string for _, cert := range a.PeerCerts { - prints = append(prints, fmt.Sprintf("%s", sha1.Sum(cert.Raw))) + prints = append(prints, fmt.Sprintf("%x", sha1.Sum(cert.Raw))) } return prints @@ -166,7 +171,7 @@ func (a *AuthRequest) GetCertFingerprints() []string { // RefreshTokenRequest is a wrapper around RefreshClaims to avoid collisions between go-jwt interface requirements and // zitadel oidc interface names. Implements zitadel op.RefreshTokenRequest type RefreshTokenRequest struct { - RefreshClaims + common.RefreshClaims } // GetAMR implements op.RefreshTokenRequest diff --git a/controller/oidc_auth/storage.go b/controller/oidc_auth/storage.go index bcf7d249f..7494e617d 100644 --- a/controller/oidc_auth/storage.go +++ b/controller/oidc_auth/storage.go @@ -6,6 +6,7 @@ import ( "crypto/sha1" "errors" "fmt" + "github.com/openziti/foundation/v2/errorz" "net/http" "strings" "sync" @@ -13,7 +14,9 @@ import ( "github.com/golang-jwt/jwt/v5" "github.com/michaelquigley/pfxlog" + "github.com/openziti/edge-api/rest_model" "github.com/openziti/foundation/v2/stringz" + "github.com/openziti/ziti/common" "github.com/openziti/ziti/controller/apierror" "github.com/openziti/ziti/controller/change" "github.com/openziti/ziti/controller/model" @@ -32,7 +35,7 @@ var ( _ op.ClientCredentialsStorage = &HybridStorage{} ) -const JwtTokenPrefix = "eY" +const JwtTokenPrefix = "ey" // Storage is a compound interface of op.Storage and custom storage functions type Storage interface { @@ -45,6 +48,10 @@ type Storage interface { // A change context is required for the removal of one-time TOTP recovery codes VerifyTotp(ctx *change.Context, code string, id string) (*AuthRequest, error) + StartTotpEnrollment(ctx *change.Context, authRequestId string) (string, error) + + CompleteTotpEnrollment(ctx *change.Context, authRequestId, code string) error + // IsTokenRevoked will return true if a token has been removed. // TokenId may be a JWT token id or an identity id IsTokenRevoked(tokenId string) bool @@ -88,6 +95,26 @@ type HybridStorage struct { keys cmap.ConcurrentMap[string, *pubKey] } +func (s *HybridStorage) StartTotpEnrollment(changeCtx *change.Context, authRequestId string) (string, error) { + authRequest, err := s.GetAuthRequest(authRequestId) + + if err != nil { + return "", errorz.NewUnauthorized() + } + + return s.env.GetManagers().Mfa.CreateForIdentityId(authRequest.IdentityId, changeCtx) +} + +func (s *HybridStorage) CompleteTotpEnrollment(changeCtx *change.Context, authRequestId, code string) error { + authRequest, err := s.GetAuthRequest(authRequestId) + + if err != nil { + return errorz.NewUnauthorized() + } + + return s.env.GetManagers().Mfa.CompleteTotpEnrollment(authRequest.IdentityId, code, changeCtx) +} + func (s *HybridStorage) AddClient(client *Client) { s.clients.Set(client.id, client) } @@ -96,20 +123,20 @@ var _ Storage = &HybridStorage{} func NewStorage(kid string, publicKey crypto.PublicKey, privateKey crypto.PrivateKey, singingMethod jwt.SigningMethod, config *Config, env model.Env) *HybridStorage { store := &HybridStorage{ - config: config, - authRequests: cmap.New[*AuthRequest](), - codes: cmap.New[string](), - clients: cmap.New[*Client](), - env: env, + env: env, signingKey: key{ id: kid, algorithm: jose.SignatureAlgorithm(singingMethod.Alg()), privateKey: privateKey, publicKey: publicKey, }, + authRequests: cmap.New[*AuthRequest](), + codes: cmap.New[string](), + clients: cmap.New[*Client](), deviceCodes: cmap.New[deviceAuthorizationEntry](), userCodes: cmap.New[string](), serviceUsers: cmap.New[*Client](), + config: config, keys: cmap.New[*pubKey](), } @@ -267,10 +294,11 @@ func (s *HybridStorage) CreateAuthRequest(ctx context.Context, authReq *oidc.Aut } request := &AuthRequest{ - AuthRequest: *authReq, - CreationDate: time.Now(), - IdentityId: identityId, - ApiSessionId: uuid.NewString(), + AuthRequest: *authReq, + CreationDate: time.Now(), + IdentityId: identityId, + ApiSessionId: uuid.NewString(), + RemoteAddress: httpRequest.RemoteAddr, } request.PeerCerts = httpRequest.TLS.PeerCertificates @@ -343,23 +371,34 @@ func (s *HybridStorage) DeleteAuthRequest(_ context.Context, id string) error { } // CreateAccessToken implements the op.Storage interface -func (s *HybridStorage) CreateAccessToken(_ context.Context, request op.TokenRequest) (string, time.Time, error) { - tokenId, claims, err := s.createAccessToken(request) +func (s *HybridStorage) CreateAccessToken(ctx context.Context, request op.TokenRequest) (string, time.Time, error) { + accessTokenId, accessClaims, err := s.createAccessToken(request) if err != nil { return "", time.Time{}, err } - return tokenId, claims.Expiration.AsTime(), nil + ts, err := TokenStateFromContext(ctx) + + if err != nil { + return "", time.Time{}, err + } + + ts.AccessClaims = accessClaims + + return accessTokenId, accessClaims.Expiration.AsTime(), nil } // createAccessToken converts an op.TokenRequest into an access token -func (s *HybridStorage) createAccessToken(request op.TokenRequest) (string, *AccessClaims, error) { +func (s *HybridStorage) createAccessToken(request op.TokenRequest) (string, *common.AccessClaims, error) { var applicationID string var apiSessionID string var amr []string var configTypes []string + var remoteAddr string var certsFingerprints []string + var envInfo *rest_model.EnvInfo + var sdkInfo *rest_model.SdkInfo now := time.Now() authTime := oidc.Time(now.Unix()) @@ -371,20 +410,25 @@ func (s *HybridStorage) createAccessToken(request op.TokenRequest) (string, *Acc configTypes = req.ConfigTypes amr = req.GetAMR() certsFingerprints = req.GetCertFingerprints() + envInfo = req.EnvInfo + sdkInfo = req.SdkInfo + remoteAddr = req.RemoteAddress case *RefreshTokenRequest: applicationID = req.ApplicationId amr = req.AuthenticationMethodsReferences authTime = req.AuthTime configTypes = req.ConfigTypes certsFingerprints = req.GetCertFingerprints() - + envInfo = req.EnvInfo + sdkInfo = req.SdkInfo + remoteAddr = req.RemoteAddress case op.TokenExchangeRequest: applicationID = req.GetClientID() claims := req.GetExchangeSubjectTokenClaims() amr = req.GetAMR() if claims != nil { - val, ok := claims[CustomClaimApiSessionId] + val, ok := claims[common.CustomClaimApiSessionId] if !ok { return "", nil, errors.New("invalid token exchange request claims: no api session id") @@ -392,17 +436,23 @@ func (s *HybridStorage) createAccessToken(request op.TokenRequest) (string, *Acc apiSessionID = val.(string) - val, ok = claims[CustomClaimsConfigTypes] + val, ok = claims[common.CustomClaimsConfigTypes] if ok { configTypes = val.([]string) } - val, ok = claims[CustomClaimsCertFingerprints] + val, ok = claims[common.CustomClaimsCertFingerprints] if ok { certsFingerprints = val.([]string) } + + val, ok = claims[common.CustomClaimRemoteAddress] + + if ok { + remoteAddr = val.(string) + } } } @@ -412,13 +462,13 @@ func (s *HybridStorage) createAccessToken(request op.TokenRequest) (string, *Acc return "", nil, err } - claims := &AccessClaims{ + claims := &common.AccessClaims{ AccessTokenClaims: oidc.AccessTokenClaims{ TokenClaims: oidc.TokenClaims{ JWTID: uuid.NewString(), Issuer: s.config.Issuer, Subject: request.GetSubject(), - Audience: []string{ClaimAudienceOpenZiti}, + Audience: []string{common.ClaimAudienceOpenZiti}, Expiration: oidc.Time(now.Add(s.config.AccessTokenDuration).Unix()), IssuedAt: oidc.Time(now.Unix()), AuthTime: authTime, @@ -427,15 +477,18 @@ func (s *HybridStorage) createAccessToken(request op.TokenRequest) (string, *Acc ClientID: applicationID, }, }, - CustomClaims: CustomClaims{ + CustomClaims: common.CustomClaims{ ApiSessionId: apiSessionID, ExternalId: stringz.OrEmpty(identity.ExternalId), IsAdmin: identity.IsAdmin, ConfigTypes: configTypes, ApplicationId: applicationID, Scopes: request.GetScopes(), - Type: TokenTypeAccess, + Type: common.TokenTypeAccess, CertFingerprints: certsFingerprints, + EnvInfo: envInfo, + SdkInfo: sdkInfo, + RemoteAddress: remoteAddr, }, } @@ -447,15 +500,24 @@ func (s *HybridStorage) createAccessToken(request op.TokenRequest) (string, *Acc } // CreateAccessAndRefreshTokens implements the op.Storage interface -func (s *HybridStorage) CreateAccessAndRefreshTokens(_ context.Context, request op.TokenRequest, currentRefreshToken string) (accessTokenID string, newRefreshToken string, expiration time.Time, err error) { +func (s *HybridStorage) CreateAccessAndRefreshTokens(ctx context.Context, request op.TokenRequest, currentRefreshToken string) (accessTokenID string, newRefreshToken string, expiration time.Time, err error) { accessTokenId, accessClaims, err := s.createAccessToken(request) if err != nil { return "", "", time.Time{}, err } + tokenState, err := TokenStateFromContext(ctx) + + if err != nil { + return "", "", time.Time{}, err + } + + tokenState.AccessClaims = accessClaims + if currentRefreshToken == "" { - refreshToken, _, err := s.createRefreshClaims(accessClaims) + refreshToken, refreshClaims, err := s.createRefreshClaims(accessClaims) + tokenState.RefreshClaims = refreshClaims if err != nil { return "", "", time.Time{}, err } @@ -463,7 +525,9 @@ func (s *HybridStorage) CreateAccessAndRefreshTokens(_ context.Context, request return accessTokenId, refreshToken, accessClaims.Expiration.AsTime(), nil } - refreshToken, _, err := s.renewRefreshToken(currentRefreshToken) + refreshToken, refreshClaims, err := s.renewRefreshToken(currentRefreshToken) + tokenState.RefreshClaims = refreshClaims + if err != nil { return "", "", time.Time{}, err } @@ -472,8 +536,8 @@ func (s *HybridStorage) CreateAccessAndRefreshTokens(_ context.Context, request } // parseRefreshToken parses a JWT refresh token -func (s *HybridStorage) parseRefreshToken(tokenStr string) (*jwt.Token, *RefreshClaims, error) { - refreshClaims := &RefreshClaims{} +func (s *HybridStorage) parseRefreshToken(tokenStr string) (*jwt.Token, *common.RefreshClaims, error) { + refreshClaims := &common.RefreshClaims{} parsedToken, err := jwt.ParseWithClaims(tokenStr, refreshClaims, s.env.JwtSignerKeyFunc) if err != nil || parsedToken == nil { @@ -484,7 +548,7 @@ func (s *HybridStorage) parseRefreshToken(tokenStr string) (*jwt.Token, *Refresh return nil, nil, fmt.Errorf("invalid refresh_token") } - if refreshClaims.Type != TokenTypeRefresh { + if refreshClaims.Type != common.TokenTypeRefresh { return nil, nil, errors.New("invalid token type") } @@ -492,8 +556,8 @@ func (s *HybridStorage) parseRefreshToken(tokenStr string) (*jwt.Token, *Refresh } // parseAccessToken parses a JWT access token -func (s *HybridStorage) parseAccessToken(tokenStr string) (*jwt.Token, *AccessClaims, error) { - accessClaims := &AccessClaims{} +func (s *HybridStorage) parseAccessToken(tokenStr string) (*jwt.Token, *common.AccessClaims, error) { + accessClaims := &common.AccessClaims{} parsedToken, err := jwt.ParseWithClaims(tokenStr, accessClaims, s.env.JwtSignerKeyFunc) if err != nil || parsedToken == nil { @@ -659,7 +723,7 @@ func (s *HybridStorage) SetUserinfoFromToken(ctx context.Context, userinfo *oidc return err } - if claims.Type != TokenTypeAccess { + if claims.Type != common.TokenTypeAccess { return errors.New("token is invalid type") } @@ -676,24 +740,20 @@ func (s *HybridStorage) GetPrivateClaimsFromScopes(ctx context.Context, identity return s.getPrivateClaims(ctx, identityId, clientID, scopes) } -func (s *HybridStorage) getPrivateClaims(_ context.Context, identityId, _ string, scopes []string) (claims map[string]interface{}, err error) { - identity, err := s.env.GetManagers().Identity.Read(identityId) - +func (s *HybridStorage) getPrivateClaims(ctx context.Context, _, _ string, scopes []string) (claims map[string]interface{}, err error) { if err != nil { return nil, err } - claims = appendClaim(claims, CustomClaimIsAdmin, identity.IsAdmin) - claims = appendClaim(claims, CustomClaimExternalId, identity.ExternalId) + tokenState, err := TokenStateFromContext(ctx) - for _, scope := range scopes { - if strings.HasPrefix(scope, ScopeApiSessionId) { - apiSessionId := scope[len(ScopeApiSessionId):] - claims = appendClaim(claims, CustomClaimApiSessionId, apiSessionId) - } + if err != nil { + return nil, err } - return claims, nil + tsClaims, err := tokenState.AccessClaims.CustomClaims.ToMap() + + return tsClaims, err } // GetKeyByIDAndClientID implements the op.Storage interface @@ -727,8 +787,8 @@ func (s *HybridStorage) Health(_ context.Context) error { return nil } -func (s *HybridStorage) createRefreshClaims(accessClaims *AccessClaims) (string, *RefreshClaims, error) { - claims := &RefreshClaims{ +func (s *HybridStorage) createRefreshClaims(accessClaims *common.AccessClaims) (string, *common.RefreshClaims, error) { + claims := &common.RefreshClaims{ IDTokenClaims: oidc.IDTokenClaims{ TokenClaims: accessClaims.TokenClaims, NotBefore: accessClaims.NotBefore, @@ -737,9 +797,9 @@ func (s *HybridStorage) createRefreshClaims(accessClaims *AccessClaims) (string, } claims.Expiration = oidc.Time(time.Now().Add(s.config.RefreshTokenDuration).Unix()) - claims.Type = TokenTypeRefresh + claims.Type = common.TokenTypeRefresh - token, _ := s.env.GetJwtSigner().Generate("", "", claims) + token, _ := s.env.GetServerJwtSigner().Generate(claims) return token, claims, nil } @@ -748,7 +808,7 @@ func (s *HybridStorage) saveRevocation(revocation *model.Revocation) error { return s.env.GetManagers().Revocation.Create(revocation, change.New()) } -func (s *HybridStorage) renewRefreshToken(currentRefreshToken string) (string, *RefreshClaims, error) { +func (s *HybridStorage) renewRefreshToken(currentRefreshToken string) (string, *common.RefreshClaims, error) { _, refreshClaims, err := s.parseRefreshToken(currentRefreshToken) if err != nil { @@ -759,7 +819,7 @@ func (s *HybridStorage) renewRefreshToken(currentRefreshToken string) (string, * return "", nil, err } - newRefreshClaims := &RefreshClaims{ + newRefreshClaims := &common.RefreshClaims{ IDTokenClaims: refreshClaims.IDTokenClaims, CustomClaims: refreshClaims.CustomClaims, } @@ -769,7 +829,7 @@ func (s *HybridStorage) renewRefreshToken(currentRefreshToken string) (string, * newRefreshClaims.NotBefore = oidc.Time(now.Unix()) newRefreshClaims.Expiration = oidc.Time(now.Add(s.config.RefreshTokenDuration).Unix()) - token, _ := s.env.GetJwtSigner().Generate("", "", newRefreshClaims) + token, _ := s.env.GetServerJwtSigner().Generate(newRefreshClaims) return token, newRefreshClaims, err } @@ -791,10 +851,10 @@ func (s *HybridStorage) setInfo(userInfo *oidc.UserInfo, identityId string, scop userInfo.Subject = identity.Id userInfo.Name = identity.Name if identity.ExternalId != nil && *identity.ExternalId != "" { - userInfo.AppendClaims(CustomClaimExternalId, identity.ExternalId) + userInfo.AppendClaims(common.CustomClaimExternalId, identity.ExternalId) } - userInfo.AppendClaims(CustomClaimIsAdmin, identity.IsAdmin) + userInfo.AppendClaims(common.CustomClaimIsAdmin, identity.IsAdmin) } } return nil diff --git a/controller/response/context.go b/controller/response/context.go index 76a69940b..b9bb7807a 100644 --- a/controller/response/context.go +++ b/controller/response/context.go @@ -20,9 +20,9 @@ import ( "errors" "github.com/golang-jwt/jwt/v5" "github.com/openziti/edge-api/rest_model" - "github.com/openziti/ziti/controller/model" - "github.com/openziti/ziti/controller/oidc_auth" + "github.com/openziti/ziti/common" "github.com/openziti/ziti/controller/change" + "github.com/openziti/ziti/controller/model" "net/http" "time" ) @@ -41,7 +41,7 @@ type RequestContext struct { // An opaque session token SessionToken string Jwt *jwt.Token - Claims *oidc_auth.AccessClaims + Claims *common.AccessClaims ApiSession *model.ApiSession Identity *model.Identity diff --git a/controller/response/responder.go b/controller/response/responder.go index 80cc3d48a..715488186 100644 --- a/controller/response/responder.go +++ b/controller/response/responder.go @@ -69,63 +69,64 @@ func (self EdgeResponseMapper) toRestModel(e *errorz.ApiError, requestId string) compositeErr, ok = e.Cause.(*errors.CompositeError) } - if causeApiError, ok := e.Cause.(*errorz.ApiError); ok { - //standard apierror - ret.Cause = &rest_model.APIErrorCause{ - APIError: *self.toRestModel(causeApiError, requestId), - } - } else if causeJsonSchemaError, ok := e.Cause.(*apierror.ValidationErrors); ok { - //only possible from config type JSON schema validation - ret.Cause = &rest_model.APIErrorCause{ - APIFieldError: rest_model.APIFieldError{ - Field: causeJsonSchemaError.Errors[0].Field, - Reason: causeJsonSchemaError.Errors[0].Error(), - Value: fmt.Sprintf("%v", causeJsonSchemaError.Errors[0].Value), - }, - } - } else if causeFieldErr, ok := e.Cause.(*errorz.FieldError); ok { - //authenticator modules and enrollment only - //todo: see if we can remove this by not using FieldError - ret.Cause = &rest_model.APIErrorCause{ - APIFieldError: rest_model.APIFieldError{ - Field: causeFieldErr.FieldName, - Value: fmt.Sprintf("%v", causeFieldErr.FieldValue), - Reason: causeFieldErr.Reason, - }, - } - if ret.Code == errorz.InvalidFieldCode { + if e.Cause != nil { + if causeApiError, ok := e.Cause.(*errorz.ApiError); ok { + //standard apierror + ret.Cause = &rest_model.APIErrorCause{ + APIError: *self.toRestModel(causeApiError, requestId), + } + } else if causeJsonSchemaError, ok := e.Cause.(*apierror.ValidationErrors); ok { + //only possible from config type JSON schema validation + ret.Cause = &rest_model.APIErrorCause{ + APIFieldError: rest_model.APIFieldError{ + Field: causeJsonSchemaError.Errors[0].Field, + Reason: causeJsonSchemaError.Errors[0].Error(), + Value: fmt.Sprintf("%v", causeJsonSchemaError.Errors[0].Value), + }, + } + } else if causeFieldErr, ok := e.Cause.(*errorz.FieldError); ok { + //authenticator modules and enrollment only + //todo: see if we can remove this by not using FieldError + ret.Cause = &rest_model.APIErrorCause{ + APIFieldError: rest_model.APIFieldError{ + Field: causeFieldErr.FieldName, + Value: fmt.Sprintf("%v", causeFieldErr.FieldValue), + Reason: causeFieldErr.Reason, + }, + } + if ret.Code == errorz.InvalidFieldCode { + ret.Code = errorz.CouldNotValidateCode + ret.Message = errorz.CouldNotValidateMessage + } + + } else if causeFieldErr, ok := e.Cause.(*errors.Validation); ok { + //open api validation errors + ret.Cause = &rest_model.APIErrorCause{ + APIFieldError: rest_model.APIFieldError{ + Field: causeFieldErr.Name, + Reason: causeFieldErr.Error(), + Value: fmt.Sprintf("%v", causeFieldErr.Value), + }, + } ret.Code = errorz.CouldNotValidateCode ret.Message = errorz.CouldNotValidateMessage - } - } else if causeFieldErr, ok := e.Cause.(*errors.Validation); ok { - //open api validation errors - ret.Cause = &rest_model.APIErrorCause{ - APIFieldError: rest_model.APIFieldError{ - Field: causeFieldErr.Name, - Reason: causeFieldErr.Error(), - Value: fmt.Sprintf("%v", causeFieldErr.Value), - }, - } - ret.Code = errorz.CouldNotValidateCode - ret.Message = errorz.CouldNotValidateMessage - - } else if genericErr, ok := e.Cause.(*apierror.GenericCauseError); ok { - ret.Cause = &rest_model.APIErrorCause{ - APIError: rest_model.APIError{ - Data: genericErr.DataMap, - Message: genericErr.Error(), - }, - } - } else { - ret.Cause = &rest_model.APIErrorCause{ - APIError: rest_model.APIError{ - Code: errorz.UnhandledCode, - Message: e.Cause.Error(), - }, + } else if genericErr, ok := e.Cause.(*apierror.GenericCauseError); ok { + ret.Cause = &rest_model.APIErrorCause{ + APIError: rest_model.APIError{ + Data: genericErr.DataMap, + Message: genericErr.Error(), + }, + } + } else { + ret.Cause = &rest_model.APIErrorCause{ + APIError: rest_model.APIError{ + Code: errorz.UnhandledCode, + Message: e.Cause.Error(), + }, + } } } - } return ret diff --git a/controller/server/client-api.go b/controller/server/client-api.go index 949f2b72c..47b38640b 100644 --- a/controller/server/client-api.go +++ b/controller/server/client-api.go @@ -21,12 +21,12 @@ import ( "github.com/openziti/edge-api/rest_client_api_client" "github.com/openziti/edge-api/rest_client_api_server" "github.com/openziti/edge-api/rest_management_api_server" + "github.com/openziti/xweb/v2" "github.com/openziti/ziti/controller" + "github.com/openziti/ziti/controller/api" "github.com/openziti/ziti/controller/apierror" "github.com/openziti/ziti/controller/env" "github.com/openziti/ziti/controller/response" - "github.com/openziti/ziti/controller/api" - "github.com/openziti/xweb/v2" "github.com/pkg/errors" "net/http" "os" @@ -59,8 +59,7 @@ func (factory ClientApiFactory) Validate(config *xweb.InstanceConfig) error { if !clientApiFound && api.Binding() == controller.ClientApiBinding { for _, bindPoint := range webListener.BindPoints { if bindPoint.Address == factory.appEnv.Config.Api.Address { - factory.appEnv.SetEnrollmentSigningCert(webListener.Identity.ServerCert()[0]) - factory.appEnv.SetServerIdentity(webListener.Identity.ServerCert()[0]) + factory.appEnv.SetServerCert(webListener.Identity.ServerCert()[0]) clientApiFound = true break } diff --git a/controller/server/controller.go b/controller/server/controller.go index 579b86eb4..541b05d4e 100644 --- a/controller/server/controller.go +++ b/controller/server/controller.go @@ -18,26 +18,24 @@ package server import ( "fmt" + "github.com/michaelquigley/pfxlog" "github.com/openziti/channel/v2" + "github.com/openziti/storage/boltz" + "github.com/openziti/ziti/common/config" "github.com/openziti/ziti/common/pb/edge_ctrl_pb" runner2 "github.com/openziti/ziti/common/runner" "github.com/openziti/ziti/controller/api_impl" - "github.com/openziti/ziti/controller/handler_edge_mgmt" - sync2 "github.com/openziti/ziti/controller/sync_strats" - "os" - "sync" - "time" - - "github.com/openziti/ziti/controller/internal/policy" - - "github.com/michaelquigley/pfxlog" - "github.com/openziti/storage/boltz" - "github.com/openziti/ziti/common/config" edgeconfig "github.com/openziti/ziti/controller/config" "github.com/openziti/ziti/controller/env" "github.com/openziti/ziti/controller/handler_edge_ctrl" + "github.com/openziti/ziti/controller/handler_edge_mgmt" + "github.com/openziti/ziti/controller/internal/policy" _ "github.com/openziti/ziti/controller/internal/routes" "github.com/openziti/ziti/controller/model" + sync2 "github.com/openziti/ziti/controller/sync_strats" + "os" + "sync" + "time" ) type Controller struct { diff --git a/controller/server/oidc-api.go b/controller/server/oidc-api.go index 218ed36ba..5c4970943 100644 --- a/controller/server/oidc-api.go +++ b/controller/server/oidc-api.go @@ -18,11 +18,12 @@ package server import ( "context" + "crypto/rand" + "encoding/hex" "fmt" "net/http" "strings" - "github.com/openziti/foundation/v2/stringz" "github.com/openziti/xweb/v2" "github.com/openziti/ziti/controller" "github.com/openziti/ziti/controller/api" @@ -108,22 +109,26 @@ func NewOidcApiHandler(serverConfig *xweb.ServerConfig, ae *env.AppEnv, options cert := serverCert[0].Leaf key := serverCert[0].PrivateKey - issuer := "https://" + ae.Config.Api.Address + "/oidc" + issuer := ae.OidcIssuer() oidcConfig := oidc_auth.NewConfig(issuer, cert, key) if secretVal, ok := options["secret"]; ok { if secret, ok := secretVal.(string); ok { secret = strings.TrimSpace(secret) - if secret == "" { - return nil, fmt.Errorf("[edge-oidc.options.secret] must not be empty") + if secret != "" { + oidcConfig.TokenSecret = secret } + } + } - oidcConfig.TokenSecret = secret - } else { - return nil, fmt.Errorf("[edge-oidc.options.secret] must be a string") + if oidcConfig.TokenSecret == "" { + bytes := make([]byte, 32) + _, err := rand.Read(bytes) + if err != nil { + return nil, fmt.Errorf("could not genreate random secret: %w", err) } - } else { - return nil, fmt.Errorf("[edge-oidc.options.secret] must be defined") + + oidcConfig.TokenSecret = hex.EncodeToString(bytes) } if redirectVal, ok := options["redirectURIs"]; ok { @@ -146,12 +151,21 @@ func NewOidcApiHandler(serverConfig *xweb.ServerConfig, ae *env.AppEnv, options } } - if !stringz.Contains(oidcConfig.RedirectURIs, "openziti://auth/callback") { + // add defaults + if len(oidcConfig.RedirectURIs) == 0 { oidcConfig.RedirectURIs = append(oidcConfig.RedirectURIs, "openziti://auth/callback") + oidcConfig.RedirectURIs = append(oidcConfig.RedirectURIs, "https://127.0.0.1:*/auth/callback") + oidcConfig.RedirectURIs = append(oidcConfig.RedirectURIs, "http://127.0.0.1:*/auth/callback") + oidcConfig.RedirectURIs = append(oidcConfig.RedirectURIs, "https://localhost:*/auth/callback") + oidcConfig.RedirectURIs = append(oidcConfig.RedirectURIs, "http://localhost:*/auth/callback") } - if !stringz.Contains(oidcConfig.PostLogoutURIs, "openziti://auth/logout") { + if len(oidcConfig.PostLogoutURIs) == 0 { oidcConfig.PostLogoutURIs = append(oidcConfig.PostLogoutURIs, "openziti://auth/logout") + oidcConfig.PostLogoutURIs = append(oidcConfig.PostLogoutURIs, "https://127.0.0.1:*/auth/logout") + oidcConfig.PostLogoutURIs = append(oidcConfig.PostLogoutURIs, "http://127.0.0.1:*/auth/logout") + oidcConfig.PostLogoutURIs = append(oidcConfig.PostLogoutURIs, "https://localhost:*/auth/logout") + oidcConfig.PostLogoutURIs = append(oidcConfig.PostLogoutURIs, "http://localhost:*/auth/logout") } var err error diff --git a/controller/sync_strats/rtx.go b/controller/sync_strats/rtx.go index 782df1611..4fe0be8da 100644 --- a/controller/sync_strats/rtx.go +++ b/controller/sync_strats/rtx.go @@ -41,6 +41,9 @@ type RouterSender struct { closeNotify chan struct{} running atomic.Bool + SupportsRouterModel bool + RouterModelIndex *uint64 + sync.Mutex } diff --git a/controller/sync_strats/sync_instant.go b/controller/sync_strats/sync_instant.go index f05815dd4..e06a2b80b 100644 --- a/controller/sync_strats/sync_instant.go +++ b/controller/sync_strats/sync_instant.go @@ -17,6 +17,10 @@ package sync_strats import ( + "context" + "crypto/sha1" + "crypto/tls" + "encoding/binary" "encoding/json" "fmt" "github.com/lucsky/cuid" @@ -24,24 +28,33 @@ import ( "github.com/openziti/channel/v2" "github.com/openziti/foundation/v2/debugz" "github.com/openziti/foundation/v2/genext" + nfPem "github.com/openziti/foundation/v2/pem" "github.com/openziti/storage/ast" + "github.com/openziti/storage/boltz" + "github.com/openziti/ziti/common" "github.com/openziti/ziti/common/build" "github.com/openziti/ziti/common/pb/edge_ctrl_pb" + "github.com/openziti/ziti/controller/change" "github.com/openziti/ziti/controller/db" "github.com/openziti/ziti/controller/env" - "github.com/openziti/ziti/controller/event" "github.com/openziti/ziti/controller/handler_edge_ctrl" "github.com/openziti/ziti/controller/model" "github.com/openziti/ziti/controller/network" cmap "github.com/orcaman/concurrent-map/v2" + "github.com/pkg/errors" "go.etcd.io/bbolt" "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/timestamppb" + "reflect" + "sync" "sync/atomic" "time" ) const ( RouterSyncStrategyInstant env.RouterSyncStrategyType = "instant" + ZdbIndexKey string = "index" + ZdbKey string = "zdb" ) var _ env.RouterSyncStrategy = &InstantStrategy{} @@ -89,8 +102,107 @@ type InstantStrategy struct { routerConnectedQueue chan *RouterSender receivedClientHelloQueue chan *RouterSender + indexProvider IndexProvider + stopNotify chan struct{} stopped atomic.Bool + *common.RouterDataModel + servicePolicyHandler *constraintToIndexedEvents[*db.ServicePolicy] + identityHandler *constraintToIndexedEvents[*db.Identity] + postureCheckHandler *constraintToIndexedEvents[*db.PostureCheck] + serviceHandler *constraintToIndexedEvents[*db.EdgeService] + caHandler *constraintToIndexedEvents[*db.Ca] + revocationHandler *constraintToIndexedEvents[*db.Revocation] +} + +func (strategy *InstantStrategy) AddPublicKey(cert *tls.Certificate) { + publicKey := newPublicKey(cert.Certificate[0], edge_ctrl_pb.DataState_PublicKey_X509CertDer, []edge_ctrl_pb.DataState_PublicKey_Usage{edge_ctrl_pb.DataState_PublicKey_ClientX509CertValidation, edge_ctrl_pb.DataState_PublicKey_JWTValidation}) + newModel := &edge_ctrl_pb.DataState_Event_PublicKey{PublicKey: publicKey} + newEvent := &edge_ctrl_pb.DataState_Event{ + Action: edge_ctrl_pb.DataState_Create, + Model: newModel, + } + + strategy.HandlePublicKeyEvent(newEvent, newModel) +} + +// Initialize implements RouterDataModelCache +func (strategy *InstantStrategy) Initialize(logSize uint64, bufferSize uint) error { + strategy.RouterDataModel = common.NewSenderRouterDataModel(logSize, bufferSize) + + if strategy.ae.HostController.IsRaftEnabled() { + strategy.indexProvider = &RaftIndexProvider{ + index: strategy.ae.GetHostController().GetRaftIndex(), + } + } else { + strategy.indexProvider = &NonHaIndexProvider{ + ae: strategy.ae, + } + } + + err := strategy.BuildAll() + + if err != nil { + return err + } + + go strategy.handleRouterModelEvents(strategy.RouterDataModel.NewListener()) + + //policy create/delete/update + strategy.servicePolicyHandler = &constraintToIndexedEvents[*db.ServicePolicy]{ + indexProvider: strategy.indexProvider, + createHandler: strategy.ServicePolicyCreate, + updateHandler: strategy.ServicePolicyUpdate, + deleteHandler: strategy.ServicePolicyDelete, + } + strategy.ae.GetStores().ServicePolicy.AddEntityConstraint(strategy.servicePolicyHandler) + + //identity create/delete/update + strategy.identityHandler = &constraintToIndexedEvents[*db.Identity]{ + indexProvider: strategy.indexProvider, + createHandler: strategy.IdentityCreate, + updateHandler: strategy.IdentityUpdate, + deleteHandler: strategy.IdentityDelete, + } + strategy.ae.GetStores().Identity.AddEntityConstraint(strategy.identityHandler) + + //posture check create/delete/update + strategy.postureCheckHandler = &constraintToIndexedEvents[*db.PostureCheck]{ + indexProvider: strategy.indexProvider, + createHandler: strategy.PostureCheckCreate, + updateHandler: strategy.PostureCheckUpdate, + deleteHandler: strategy.PostureCheckDelete, + } + strategy.ae.GetStores().PostureCheck.AddEntityConstraint(strategy.postureCheckHandler) + + //service create/delete/update + strategy.serviceHandler = &constraintToIndexedEvents[*db.EdgeService]{ + indexProvider: strategy.indexProvider, + createHandler: strategy.ServiceCreate, + updateHandler: strategy.ServiceUpdate, + deleteHandler: strategy.ServiceDelete, + } + strategy.ae.GetStores().EdgeService.AddEntityConstraint(strategy.serviceHandler) + + //ca create/delete/update + strategy.caHandler = &constraintToIndexedEvents[*db.Ca]{ + indexProvider: strategy.indexProvider, + createHandler: strategy.CaCreate, + updateHandler: strategy.CaUpdate, + deleteHandler: strategy.CaDelete, + } + strategy.ae.GetStores().Ca.AddEntityConstraint(strategy.caHandler) + + //ca create/delete/update + strategy.revocationHandler = &constraintToIndexedEvents[*db.Revocation]{ + indexProvider: strategy.indexProvider, + createHandler: strategy.RevocationCreate, + updateHandler: strategy.RevocationUpdate, + deleteHandler: strategy.RevocationDelete, + } + strategy.ae.GetStores().Ca.AddEntityConstraint(strategy.caHandler) + + return nil } func NewInstantStrategy(ae *env.AppEnv, options InstantStrategyOptions) *InstantStrategy { @@ -126,8 +238,14 @@ func NewInstantStrategy(ae *env.AppEnv, options InstantStrategyOptions) *Instant ae: ae, routerConnectedQueue: make(chan *RouterSender, options.MaxQueuedRouterConnects), receivedClientHelloQueue: make(chan *RouterSender, options.MaxQueuedClientHellos), + RouterDataModel: common.NewSenderRouterDataModel(10000, 10000), + stopNotify: make(chan struct{}), + } - stopNotify: make(chan struct{}), + err := strategy.Initialize(10000, 1000) + + if err != nil { + pfxlog.Logger().WithError(err).Fatal("could not build initial data model for router synchronization") } strategy.helloHandler = handler_edge_ctrl.NewHelloHandler(ae, strategy.ReceiveClientHello) @@ -223,29 +341,6 @@ func (strategy *InstantStrategy) GetReceiveHandlers() []channel.TypedReceiveHand return result } -func (strategy *InstantStrategy) PeerAdded(peers []*event.ClusterPeer) { - logger := pfxlog.Logger().WithField("strategy", strategy.Type()) - - logger.WithField("peerCount", len(peers)).Info("new signing certificates from peers") - - keys := &edge_ctrl_pb.SignerCerts{} - - var addrs []string - - for _, peer := range peers { - addrs = append(addrs, peer.Addr) - for _, cert := range peer.ServerCert { - keys.Keys = append(keys.Keys, cert.Raw) - } - } - - strategy.rtxMap.Range(func(rtx *RouterSender) { - _ = strategy.sendSigningCerts(rtx, keys) - }) - - logger.WithField("addrs", addrs).Info("done sending new signing certificates") -} - func (strategy *InstantStrategy) ApiSessionAdded(apiSession *db.ApiSession) { logger := pfxlog.Logger().WithField("strategy", strategy.Type()) @@ -376,48 +471,28 @@ func (strategy *InstantStrategy) hello(rtx *RouterSender) { strategy.sendHello(rtx) } -func (strategy *InstantStrategy) getSignerKeys() *edge_ctrl_pb.SignerCerts { - signers := strategy.ae.HostController.GetPeerSigners() - - var keys [][]byte - for _, signer := range signers { - keys = append(keys, signer.Raw) - } - - serverCert, _, _ := strategy.ae.GetServerCert() - - keys = append(keys, serverCert.Certificate[0]) - - signerKeys := &edge_ctrl_pb.SignerCerts{ - Keys: keys, - } - - return signerKeys -} - func (strategy *InstantStrategy) sendHello(rtx *RouterSender) { logger := rtx.logger().WithField("strategy", strategy.Type()) serverVersion := build.GetBuildInfo().Version() serverHello := &edge_ctrl_pb.ServerHello{ - Version: serverVersion, + Version: serverVersion, + Data: map[string]string{ + "instant": "true", + "routerModel": "true", + }, ByteData: map[string][]byte{}, } - signerKeysBuf, err := proto.Marshal(strategy.getSignerKeys()) - - if err != nil { - logger.WithError(err).Error("could not create signer keys on edge router connect") - } else { - serverHello.ByteData[edge_ctrl_pb.SignerPublicCertsHeader] = signerKeysBuf - } - buf, err := proto.Marshal(serverHello) if err != nil { logger.WithError(err).Error("could not marshal serverHello") return } + msg := channel.NewMessage(env.ServerHelloType, buf) + + msg.PutBoolHeader(int32(edge_ctrl_pb.Header_RouterDataModel), true) - if err = channel.NewMessage(env.ServerHelloType, buf).WithTimeout(strategy.HelloSendTimeout).Send(rtx.Router.Control); err != nil { + if err = msg.WithTimeout(strategy.HelloSendTimeout).Send(rtx.Router.Control); err != nil { if rtx.Router.Control.IsClosed() { rtx.SetSyncStatus(env.RouterSyncDisconnected) rtx.logger().WithError(err).Error("timed out sending serverHello message for edge router, connection closed, giving up") @@ -451,10 +526,12 @@ func (strategy *InstantStrategy) ReceiveResync(routerId string, _ *edge_ctrl_pb. rtx.logger().WithField("strategy", strategy.Type()).Info("received resync from router, queuing") + rtx.RouterModelIndex = nil + strategy.receivedClientHelloQueue <- rtx } -func (strategy *InstantStrategy) ReceiveClientHello(routerId string, respHello *edge_ctrl_pb.ClientHello) { +func (strategy *InstantStrategy) ReceiveClientHello(routerId string, msg *channel.Message, respHello *edge_ctrl_pb.ClientHello) { rtx := strategy.rtxMap.Get(routerId) if rtx == nil { @@ -482,6 +559,14 @@ func (strategy *InstantStrategy) ReceiveClientHello(routerId string, respHello * WithField("os", rtx.Router.VersionInfo.OS). WithField("arch", rtx.Router.VersionInfo.Arch) + if supported, ok := msg.Headers.GetBoolHeader(int32(edge_ctrl_pb.Header_RouterDataModel)); ok && supported { + rtx.SupportsRouterModel = true + + if index, ok := msg.Headers.GetUint64Header(int32(edge_ctrl_pb.Header_RouterDataModelIndex)); ok { + rtx.RouterModelIndex = &index + } + } + protocols := map[string]string{} if len(respHello.Listeners) > 0 { @@ -509,16 +594,16 @@ func (strategy *InstantStrategy) ReceiveClientHello(routerId string, respHello * func (strategy *InstantStrategy) synchronize(rtx *RouterSender) { defer func() { - rtx.logger().WithField("strategy", strategy.Type()).Infof("exiting synchronization, final status: %s", rtx.SyncStatus()) + rtx.logger().WithField("strategy", strategy.Type()).WithField("SupportsRouterModel", rtx.SupportsRouterModel).Infof("exiting synchronization, final status: %s", rtx.SyncStatus()) }() if rtx.Router.Control.IsClosed() { rtx.SetSyncStatus(env.RouterSyncDisconnected) - rtx.logger().WithField("strategy", strategy.Type()).Error("attempting to start synchronization with edge router, but it has disconnected") + rtx.logger().WithField("strategy", strategy.Type()).WithField("SupportsRouterModel", rtx.SupportsRouterModel).Error("attempting to start synchronization with edge router, but it has disconnected") } rtx.SetSyncStatus(env.RouterSynInProgress) - logger := rtx.logger().WithField("strategy", strategy.Type()) + logger := rtx.logger().WithField("strategy", strategy.Type()).WithField("SupportsRouterModel", rtx.SupportsRouterModel) logger.Info("started synchronizing edge router") chunkSize := 100 @@ -573,9 +658,77 @@ func (strategy *InstantStrategy) synchronize(rtx *RouterSender) { if err != nil { logger.WithError(err).Error("failure synchronizing api sessions") rtx.SetSyncStatus(env.RouterSyncError) - } else { - rtx.SetSyncStatus(env.RouterSyncDone) + return } + + if rtx.SupportsRouterModel { + replayFrom := rtx.RouterModelIndex + + if replayFrom != nil { + rtx.RouterModelIndex = nil + events, ok := strategy.RouterDataModel.ReplayFrom(*replayFrom) + + if ok { + var err error + for _, curEvent := range events { + err = strategy.sendDataStatEvent(rtx, curEvent) + if err != nil { + pfxlog.Logger().WithError(err). + WithField("eventIndex", curEvent.Index). + WithField("evenType", reflect.TypeOf(curEvent).String()). + WithField("eventAction", curEvent.Action). + WithField("eventIsSynthetic", curEvent.IsSynthetic). + Error("could not send data state event") + } + } + + for tuple := range strategy.RouterDataModel.PublicKeys.IterBuffered() { + peerEvent := &edge_ctrl_pb.DataState_Event{ + IsSynthetic: true, + Action: edge_ctrl_pb.DataState_Create, + Model: &edge_ctrl_pb.DataState_Event_PublicKey{ + PublicKey: newPublicKey(tuple.Val.Data, tuple.Val.Format, tuple.Val.Usages), + }, + } + + err = strategy.sendDataStatEvent(rtx, peerEvent) + + if err != nil { + pfxlog.Logger().WithError(err). + WithField("eventIndex", peerEvent.Index). + WithField("evenType", reflect.TypeOf(peerEvent).String()). + WithField("eventAction", peerEvent.Action). + WithField("eventIsSynthetic", peerEvent.IsSynthetic). + Error("could not send data state event for peers") + } + } + } + + // no error sync is done, if err try full state + if err == nil { + rtx.SetSyncStatus(env.RouterSyncDone) + return + } + + pfxlog.Logger().WithError(err).Error("could not send events for router sync, attempting full state") + } + + //full sync + dataState := strategy.RouterDataModel.GetDataState() + + if dataState == nil { + return + } + dataState.EndIndex = strategy.indexProvider.CurrentIndex() + + if err := strategy.sendDataState(rtx, dataState); err != nil { + logger.WithError(err).Error("failure sending full data state") + rtx.SetSyncStatus(env.RouterSyncError) + return + } + } + + rtx.SetSyncStatus(env.RouterSyncDone) } func (strategy *InstantStrategy) sendApiSessionAdded(rtx *RouterSender, isFullState bool, state *InstantSyncState, apiSessions []*edge_ctrl_pb.ApiSession) error { @@ -596,12 +749,26 @@ func (strategy *InstantStrategy) sendApiSessionAdded(rtx *RouterSender, isFullSt return rtx.Send(msg) } -func (strategy *InstantStrategy) sendSigningCerts(rtx *RouterSender, keys *edge_ctrl_pb.SignerCerts) interface{} { - msgContentBytes, _ := proto.Marshal(keys) +func (strategy *InstantStrategy) handleRouterModelEvents(eventChannel <-chan *edge_ctrl_pb.DataState_Event) { + for { + select { + case newEvent := <-eventChannel: + strategy.rtxMap.Range(func(rtx *RouterSender) { - msg := channel.NewMessage(env.SigningCertAdded, msgContentBytes) + if !rtx.SupportsRouterModel { + return + } - return rtx.Send(msg) + err := strategy.sendDataStatEvent(rtx, newEvent) + + if err != nil { + pfxlog.Logger().WithError(err).WithField("routerId", rtx.Router.Id).Error("error sending data state to router") + } + }) + case <-strategy.ae.HostController.GetCloseNotifyChannel(): + return + } + } } type InstantSyncState struct { @@ -609,3 +776,715 @@ type InstantSyncState struct { IsLast bool `json:"isLast"` // Sequence int `json:"sequence"` //increasing id from 0 per id for the } + +func (strategy *InstantStrategy) BuildServicePolicies(tx *bbolt.Tx) error { + for cursor := strategy.ae.GetStores().ServicePolicy.IterateIds(tx, ast.BoolNodeTrue); cursor.IsValid(); cursor.Next() { + currentBytes := cursor.Current() + currentId := string(currentBytes) + + storeModel, err := strategy.ae.GetStores().ServicePolicy.LoadOneById(tx, currentId) + + if err != nil { + return err + } + + servicePolicy := newServicePolicy(tx, strategy.ae, storeModel) + + newModel := &edge_ctrl_pb.DataState_Event_ServicePolicy{ServicePolicy: servicePolicy} + newEvent := &edge_ctrl_pb.DataState_Event{ + Action: edge_ctrl_pb.DataState_Create, + Model: newModel, + } + strategy.HandleServicePolicyEvent(newEvent, newModel) + } + + return nil +} + +func (strategy *InstantStrategy) BuildPublicKeys(tx *bbolt.Tx) error { + for _, x509Cert := range strategy.ae.HostController.GetPeerSigners() { + publicKey := newPublicKey(x509Cert.Raw, edge_ctrl_pb.DataState_PublicKey_X509CertDer, []edge_ctrl_pb.DataState_PublicKey_Usage{edge_ctrl_pb.DataState_PublicKey_ClientX509CertValidation, edge_ctrl_pb.DataState_PublicKey_JWTValidation}) + newModel := &edge_ctrl_pb.DataState_Event_PublicKey{PublicKey: publicKey} + newEvent := &edge_ctrl_pb.DataState_Event{ + Action: edge_ctrl_pb.DataState_Create, + Model: newModel, + } + + strategy.HandlePublicKeyEvent(newEvent, newModel) + } + + caPEMs := strategy.ae.Config.CaPems() + caCerts := nfPem.PemBytesToCertificates(caPEMs) + + for _, caCert := range caCerts { + publicKey := newPublicKey(caCert.Raw, edge_ctrl_pb.DataState_PublicKey_X509CertDer, []edge_ctrl_pb.DataState_PublicKey_Usage{edge_ctrl_pb.DataState_PublicKey_JWTValidation, edge_ctrl_pb.DataState_PublicKey_ClientX509CertValidation}) + newModel := &edge_ctrl_pb.DataState_Event_PublicKey{PublicKey: publicKey} + newEvent := &edge_ctrl_pb.DataState_Event{ + Action: edge_ctrl_pb.DataState_Create, + Model: newModel, + } + + strategy.HandlePublicKeyEvent(newEvent, newModel) + } + + for cursor := strategy.ae.GetStores().Ca.IterateIds(tx, ast.BoolNodeTrue); cursor.IsValid(); cursor.Next() { + currentBytes := cursor.Current() + currentId := string(currentBytes) + + ca, err := strategy.ae.GetStores().Ca.LoadOneById(tx, currentId) + + if err != nil { + return err + } + + certs := nfPem.PemStringToCertificates(ca.CertPem) + + if len(certs) == 0 { + continue + } + + publicKey := newPublicKey(certs[0].Raw, edge_ctrl_pb.DataState_PublicKey_X509CertDer, []edge_ctrl_pb.DataState_PublicKey_Usage{edge_ctrl_pb.DataState_PublicKey_ClientX509CertValidation}) + + newModel := &edge_ctrl_pb.DataState_Event_PublicKey{PublicKey: publicKey} + newEvent := &edge_ctrl_pb.DataState_Event{ + Action: edge_ctrl_pb.DataState_Create, + Model: newModel, + } + strategy.HandlePublicKeyEvent(newEvent, newModel) + } + + return nil +} + +func (strategy *InstantStrategy) BuildAll() error { + err := strategy.ae.GetDbProvider().GetDb().View(func(tx *bbolt.Tx) error { + if err := strategy.BuildIdentities(tx); err != nil { + return err + } + + if err := strategy.BuildServices(tx); err != nil { + return err + } + + if err := strategy.BuildPostureChecks(tx); err != nil { + return err + } + + if err := strategy.BuildServicePolicies(tx); err != nil { + return err + } + + if err := strategy.BuildPublicKeys(tx); err != nil { + return err + } + + strategy.SetCurrentIndex(strategy.indexProvider.CurrentIndex()) + + return nil + }) + + return err +} + +func (strategy *InstantStrategy) BuildIdentities(tx *bbolt.Tx) error { + for cursor := strategy.ae.GetStores().Identity.IterateIds(tx, ast.BoolNodeTrue); cursor.IsValid(); cursor.Next() { + currentBytes := cursor.Current() + currentId := string(currentBytes) + + identity, err := newIdentityById(tx, strategy.ae, currentId) + + if err != nil { + return err + + } + + newModel := &edge_ctrl_pb.DataState_Event_Identity{Identity: identity} + newEvent := &edge_ctrl_pb.DataState_Event{ + Action: edge_ctrl_pb.DataState_Create, + Model: newModel, + } + strategy.HandleIdentityEvent(newEvent, newModel) + } + + return nil +} + +func (strategy *InstantStrategy) BuildServices(tx *bbolt.Tx) error { + for cursor := strategy.ae.GetStores().EdgeService.IterateIds(tx, ast.BoolNodeTrue); cursor.IsValid(); cursor.Next() { + currentBytes := cursor.Current() + currentId := string(currentBytes) + + service, err := newServiceById(tx, strategy.ae, currentId) + + if err != nil { + return err + } + + newModel := &edge_ctrl_pb.DataState_Event_Service{Service: service} + newEvent := &edge_ctrl_pb.DataState_Event{ + Action: edge_ctrl_pb.DataState_Create, + Model: newModel, + } + strategy.HandleServiceEvent(newEvent, newModel) + } + + return nil +} + +func (strategy *InstantStrategy) BuildPostureChecks(tx *bbolt.Tx) error { + for cursor := strategy.ae.GetStores().PostureCheck.IterateIds(tx, ast.BoolNodeTrue); cursor.IsValid(); cursor.Next() { + currentBytes := cursor.Current() + currentId := string(currentBytes) + + postureCheck, err := newPostureCheckById(tx, strategy.ae, currentId) + + if err != nil { + return err + } + + newModel := &edge_ctrl_pb.DataState_Event_PostureCheck{PostureCheck: postureCheck} + newEvent := &edge_ctrl_pb.DataState_Event{ + Action: edge_ctrl_pb.DataState_Create, + Model: newModel, + } + strategy.HandlePostureCheckEvent(newEvent, newModel) + } + return nil +} + +func newIdentityById(tx *bbolt.Tx, ae *env.AppEnv, id string) (*edge_ctrl_pb.DataState_Identity, error) { + identityModel, err := ae.GetStores().Identity.LoadOneById(tx, id) + + if err != nil { + return nil, err + } + + return newIdentity(identityModel), nil +} + +func newIdentity(identityModel *db.Identity) *edge_ctrl_pb.DataState_Identity { + return &edge_ctrl_pb.DataState_Identity{ + Id: identityModel.Id, + Name: identityModel.Name, + } +} + +func newServicePolicy(tx *bbolt.Tx, env *env.AppEnv, storeModel *db.ServicePolicy) *edge_ctrl_pb.DataState_ServicePolicy { + servicePolicy := &edge_ctrl_pb.DataState_ServicePolicy{ + Id: storeModel.Id, + Name: storeModel.Name, + } + + result := env.GetManagers().ServicePolicy.ListAssociatedIds(tx, storeModel.Id) + + servicePolicy.PostureCheckIds = result.PostureCheckIds + servicePolicy.ServiceIds = result.ServiceIds + servicePolicy.IdentityIds = result.IdentityIds + + return servicePolicy +} + +func newServiceById(tx *bbolt.Tx, ae *env.AppEnv, id string) (*edge_ctrl_pb.DataState_Service, error) { + storeModel, err := ae.GetStores().EdgeService.LoadOneById(tx, id) + + if err != nil { + return nil, err + } + + return newService(storeModel), nil +} + +func newService(storeModel *db.EdgeService) *edge_ctrl_pb.DataState_Service { + return &edge_ctrl_pb.DataState_Service{ + Id: storeModel.Id, + Name: storeModel.Name, + } +} + +func newPublicKey(data []byte, format edge_ctrl_pb.DataState_PublicKey_Format, usages []edge_ctrl_pb.DataState_PublicKey_Usage) *edge_ctrl_pb.DataState_PublicKey { + return &edge_ctrl_pb.DataState_PublicKey{ + Data: data, + Kid: fmt.Sprintf("%x", sha1.Sum(data)), + Usages: usages, + Format: format, + } +} + +func newPostureCheckById(tx *bbolt.Tx, ae *env.AppEnv, id string) (*edge_ctrl_pb.DataState_PostureCheck, error) { + postureModel, err := ae.GetStores().PostureCheck.LoadOneById(tx, id) + + if err != nil { + return nil, err + } + return newPostureCheck(postureModel), nil +} + +func newPostureCheck(postureModel *db.PostureCheck) *edge_ctrl_pb.DataState_PostureCheck { + newVal := &edge_ctrl_pb.DataState_PostureCheck{ + Id: postureModel.Id, + Name: postureModel.Name, + TypeId: postureModel.TypeId, + } + + switch subType := postureModel.SubType.(type) { + case *db.PostureCheckProcess: + newVal.Subtype = &edge_ctrl_pb.DataState_PostureCheck_Process_{ + Process: &edge_ctrl_pb.DataState_PostureCheck_Process{ + OsType: subType.OperatingSystem, + Path: subType.Path, + Hashes: subType.Hashes, + Fingerprints: []string{subType.Fingerprint}, + }, + } + case *db.PostureCheckProcessMulti: + processList := &edge_ctrl_pb.DataState_PostureCheck_ProcessMulti_{ + ProcessMulti: &edge_ctrl_pb.DataState_PostureCheck_ProcessMulti{ + Semantic: subType.Semantic, + }, + } + + for _, process := range subType.Processes { + newProc := &edge_ctrl_pb.DataState_PostureCheck_Process{ + OsType: process.OsType, + Path: process.Path, + Hashes: process.Hashes, + Fingerprints: process.SignerFingerprints, + } + + processList.ProcessMulti.Processes = append(processList.ProcessMulti.Processes, newProc) + } + + newVal.Subtype = processList + case *db.PostureCheckMfa: + newVal.Subtype = &edge_ctrl_pb.DataState_PostureCheck_Mfa_{ + Mfa: &edge_ctrl_pb.DataState_PostureCheck_Mfa{ + TimeoutSeconds: subType.TimeoutSeconds, + PromptOnWake: subType.PromptOnWake, + PromptOnUnlock: subType.PromptOnUnlock, + IgnoreLegacyEndpoints: subType.IgnoreLegacyEndpoints, + }, + } + + case *db.PostureCheckWindowsDomains: + newVal.Subtype = &edge_ctrl_pb.DataState_PostureCheck_Domains_{ + Domains: &edge_ctrl_pb.DataState_PostureCheck_Domains{ + Domains: subType.Domains, + }, + } + case *db.PostureCheckMacAddresses: + newVal.Subtype = &edge_ctrl_pb.DataState_PostureCheck_Mac_{ + Mac: &edge_ctrl_pb.DataState_PostureCheck_Mac{ + MacAddresses: subType.MacAddresses, + }, + } + case *db.PostureCheckOperatingSystem: + + osList := &edge_ctrl_pb.DataState_PostureCheck_OsList{} + + for _, os := range subType.OperatingSystems { + newOs := &edge_ctrl_pb.DataState_PostureCheck_Os{ + OsType: os.OsType, + OsVersions: os.OsVersions, + } + + osList.OsList = append(osList.OsList, newOs) + } + + newVal.Subtype = &edge_ctrl_pb.DataState_PostureCheck_OsList_{ + OsList: osList, + } + } + + return newVal +} + +func actionToName(action edge_ctrl_pb.DataState_Action) string { + switch action { + case edge_ctrl_pb.DataState_Create: + return "CREATE" + case edge_ctrl_pb.DataState_Update: + return "UPDATE" + case edge_ctrl_pb.DataState_Delete: + return "DELETE" + } + + return "UNKNOWN" +} + +func (strategy *InstantStrategy) ServicePolicyCreate(index uint64, servicePolicy *db.ServicePolicy) { + strategy.handleServicePolicy(index, edge_ctrl_pb.DataState_Create, servicePolicy) +} + +func (strategy *InstantStrategy) ServicePolicyUpdate(index uint64, servicePolicy *db.ServicePolicy) { + strategy.handleServicePolicy(index, edge_ctrl_pb.DataState_Update, servicePolicy) +} + +func (strategy *InstantStrategy) ServicePolicyDelete(index uint64, servicePolicy *db.ServicePolicy) { + strategy.handleServicePolicy(index, edge_ctrl_pb.DataState_Delete, servicePolicy) +} + +func (strategy *InstantStrategy) handleServicePolicy(index uint64, action edge_ctrl_pb.DataState_Action, servicePolicy *db.ServicePolicy) { + var sp *edge_ctrl_pb.DataState_ServicePolicy + + err := strategy.ae.GetDbProvider().GetDb().View(func(tx *bbolt.Tx) error { + sp = newServicePolicy(tx, strategy.ae, servicePolicy) + return nil + }) + + if err != nil { + pfxlog.Logger().WithField("id", servicePolicy.Id).WithError(err).Errorf("could not handle %s for %T", actionToName(action), servicePolicy) + return + } + + strategy.Apply(&edge_ctrl_pb.DataState_Event{ + Index: index, + Action: action, + Model: &edge_ctrl_pb.DataState_Event_ServicePolicy{ + ServicePolicy: sp, + }, + }) +} + +func (strategy *InstantStrategy) IdentityCreate(index uint64, identity *db.Identity) { + strategy.handleIdentity(index, edge_ctrl_pb.DataState_Create, identity) +} + +func (strategy *InstantStrategy) IdentityUpdate(index uint64, identity *db.Identity) { + strategy.handleIdentity(index, edge_ctrl_pb.DataState_Update, identity) +} + +func (strategy *InstantStrategy) IdentityDelete(index uint64, identity *db.Identity) { + strategy.handleIdentity(index, edge_ctrl_pb.DataState_Delete, identity) +} + +func (strategy *InstantStrategy) handleIdentity(index uint64, action edge_ctrl_pb.DataState_Action, identity *db.Identity) { + id := newIdentity(identity) + + strategy.Apply(&edge_ctrl_pb.DataState_Event{ + Index: index, + Action: action, + Model: &edge_ctrl_pb.DataState_Event_Identity{ + Identity: id, + }, + }) +} + +func (strategy *InstantStrategy) ServiceCreate(index uint64, service *db.EdgeService) { + strategy.handleService(index, edge_ctrl_pb.DataState_Create, service) +} + +func (strategy *InstantStrategy) ServiceUpdate(index uint64, service *db.EdgeService) { + strategy.handleService(index, edge_ctrl_pb.DataState_Update, service) +} + +func (strategy *InstantStrategy) ServiceDelete(index uint64, service *db.EdgeService) { + strategy.handleService(index, edge_ctrl_pb.DataState_Delete, service) +} + +func (strategy *InstantStrategy) handleService(index uint64, action edge_ctrl_pb.DataState_Action, service *db.EdgeService) { + svc := newService(service) + + strategy.Apply(&edge_ctrl_pb.DataState_Event{ + Index: index, + Action: action, + Model: &edge_ctrl_pb.DataState_Event_Service{ + Service: svc, + }, + }) +} + +func (strategy *InstantStrategy) handlePostureCheck(index uint64, action edge_ctrl_pb.DataState_Action, postureCheck *db.PostureCheck) { + pc := newPostureCheck(postureCheck) + + strategy.Apply(&edge_ctrl_pb.DataState_Event{ + Index: index, + Action: action, + Model: &edge_ctrl_pb.DataState_Event_PostureCheck{ + PostureCheck: pc, + }, + }) +} + +func (strategy *InstantStrategy) PostureCheckCreate(index uint64, postureCheck *db.PostureCheck) { + strategy.handlePostureCheck(index, edge_ctrl_pb.DataState_Create, postureCheck) +} + +func (strategy *InstantStrategy) PostureCheckUpdate(index uint64, postureCheck *db.PostureCheck) { + strategy.handlePostureCheck(index, edge_ctrl_pb.DataState_Update, postureCheck) +} + +func (strategy *InstantStrategy) PostureCheckDelete(index uint64, postureCheck *db.PostureCheck) { + strategy.handlePostureCheck(index, edge_ctrl_pb.DataState_Delete, postureCheck) +} + +func (strategy *InstantStrategy) PeerAdded(peer *db.Controller) { + if len(peer.CertPem) > 0 { + certs := nfPem.PemBytesToCertificates([]byte(peer.CertPem)) + + if len(certs) > 0 { + strategy.Apply(&edge_ctrl_pb.DataState_Event{ + IsSynthetic: true, + Action: edge_ctrl_pb.DataState_Create, + Model: &edge_ctrl_pb.DataState_Event_PublicKey{ + PublicKey: newPublicKey(certs[0].Raw, edge_ctrl_pb.DataState_PublicKey_X509CertDer, []edge_ctrl_pb.DataState_PublicKey_Usage{edge_ctrl_pb.DataState_PublicKey_ClientX509CertValidation, edge_ctrl_pb.DataState_PublicKey_JWTValidation}), + }, + }) + } else { + pfxlog.Logger().Warn("peer added event, certificate pem did not parse to at least one certificate") + } + } else { + pfxlog.Logger().Warn("peer added event without certificate pem") + } +} + +func (strategy *InstantStrategy) CaCreate(index uint64, ca *db.Ca) { + certs := nfPem.PemBytesToCertificates([]byte(ca.CertPem)) + + if len(certs) > 0 { + strategy.handlePublicKey(index, edge_ctrl_pb.DataState_Create, newPublicKey(certs[0].Raw, edge_ctrl_pb.DataState_PublicKey_X509CertDer, []edge_ctrl_pb.DataState_PublicKey_Usage{edge_ctrl_pb.DataState_PublicKey_ClientX509CertValidation})) + } +} + +func (strategy *InstantStrategy) CaUpdate(index uint64, ca *db.Ca) { + certs := nfPem.PemBytesToCertificates([]byte(ca.CertPem)) + + if len(certs) > 0 { + strategy.handlePublicKey(index, edge_ctrl_pb.DataState_Update, newPublicKey(certs[0].Raw, edge_ctrl_pb.DataState_PublicKey_X509CertDer, []edge_ctrl_pb.DataState_PublicKey_Usage{edge_ctrl_pb.DataState_PublicKey_ClientX509CertValidation})) + } +} + +func (strategy *InstantStrategy) CaDelete(index uint64, ca *db.Ca) { + certs := nfPem.PemBytesToCertificates([]byte(ca.CertPem)) + + if len(certs) > 0 { + strategy.handlePublicKey(index, edge_ctrl_pb.DataState_Delete, newPublicKey(certs[0].Raw, edge_ctrl_pb.DataState_PublicKey_X509CertDer, []edge_ctrl_pb.DataState_PublicKey_Usage{edge_ctrl_pb.DataState_PublicKey_ClientX509CertValidation})) + } +} + +func (strategy *InstantStrategy) RevocationCreate(index uint64, revocation *db.Revocation) { + strategy.handleRevocation(index, edge_ctrl_pb.DataState_Create, revocation) +} + +func (strategy *InstantStrategy) RevocationUpdate(index uint64, revocation *db.Revocation) { + strategy.handleRevocation(index, edge_ctrl_pb.DataState_Create, revocation) +} + +func (strategy *InstantStrategy) RevocationDelete(index uint64, revocation *db.Revocation) { + strategy.handleRevocation(index, edge_ctrl_pb.DataState_Create, revocation) +} + +func (strategy *InstantStrategy) handlePublicKey(index uint64, action edge_ctrl_pb.DataState_Action, publicKey *edge_ctrl_pb.DataState_PublicKey) { + strategy.Apply(&edge_ctrl_pb.DataState_Event{ + Index: index, + Action: action, + Model: &edge_ctrl_pb.DataState_Event_PublicKey{ + PublicKey: publicKey, + }, + }) +} + +func (strategy *InstantStrategy) sendDataStatEvent(rtx *RouterSender, stateEvent *edge_ctrl_pb.DataState_Event) error { + content, err := proto.Marshal(stateEvent) + + if err != nil { + return err + } + + msg := channel.NewMessage(env.DataStateEventType, content) + + return rtx.Send(msg) + +} + +func (strategy *InstantStrategy) sendDataState(rtx *RouterSender, state *edge_ctrl_pb.DataState) error { + content, err := proto.Marshal(state) + + if err != nil { + return err + } + + msg := channel.NewMessage(env.DataStateType, content) + + return rtx.Send(msg) +} + +func (strategy *InstantStrategy) handleRevocation(index uint64, action edge_ctrl_pb.DataState_Action, revocation *db.Revocation) { + strategy.Apply(&edge_ctrl_pb.DataState_Event{ + Index: index, + Action: action, + Model: &edge_ctrl_pb.DataState_Event_Revocation{ + Revocation: &edge_ctrl_pb.DataState_Revocation{ + Id: revocation.Id, + ExpiresAt: timestamppb.New(revocation.ExpiresAt), + }, + }, + }) +} + +type IndexProvider interface { + // NextIndex provides an index for the supplied MutateContext. + NextIndex(ctx boltz.MutateContext) (uint64, error) + + // CurrentIndex provides the current index + CurrentIndex() uint64 +} + +type NonHaIndexProvider struct { + ae *env.AppEnv + initialLoad sync.Once + index uint64 + + lock sync.Mutex +} + +func (p *NonHaIndexProvider) load() { + p.lock.Lock() + defer p.lock.Unlock() + + ctx := boltz.NewMutateContext(context.Background()) + err := p.ae.GetDbProvider().GetDb().Update(ctx, func(ctx boltz.MutateContext) error { + zdb, err := ctx.Tx().CreateBucketIfNotExists([]byte(ZdbKey)) + + if err != nil { + return err + } + + indexBytes := zdb.Get([]byte(ZdbIndexKey)) + + if len(indexBytes) == 8 { + p.index = binary.BigEndian.Uint64(indexBytes) + } else { + p.index = 0 + indexBytes = make([]byte, 8) + binary.BigEndian.PutUint64(indexBytes, p.index) + _ = zdb.Put([]byte(ZdbIndexKey), indexBytes) + } + + return nil + }) + + if err != nil { + pfxlog.Logger().WithError(err).Fatal("could not load initial index") + } +} + +func (p *NonHaIndexProvider) NextIndex(_ boltz.MutateContext) (uint64, error) { + p.initialLoad.Do(p.load) + + p.lock.Lock() + defer p.lock.Unlock() + + ctx := boltz.NewMutateContext(context.Background()) + err := p.ae.GetDbProvider().GetDb().Update(ctx, func(ctx boltz.MutateContext) error { + zdb := ctx.Tx().Bucket([]byte(ZdbKey)) + + newIndex := p.index + 1 + + indexBytes := make([]byte, 8) // Create a byte slice with 8 bytes + binary.BigEndian.PutUint64(indexBytes, newIndex) + err := zdb.Put([]byte(ZdbIndexKey), indexBytes) + + if err != nil { + return err + } + + p.index = newIndex + return nil + }) + + if err != nil { + return 0, err + } + + return p.index, nil +} + +func (p *NonHaIndexProvider) CurrentIndex() uint64 { + p.initialLoad.Do(p.load) + + p.lock.Lock() + defer p.lock.Unlock() + + return p.index +} + +type RaftIndexProvider struct { + index uint64 + lock sync.Mutex +} + +func (p *RaftIndexProvider) NextIndex(ctx boltz.MutateContext) (uint64, error) { + p.lock.Lock() + defer p.lock.Unlock() + + changeCtx := change.FromContext(ctx.Context()) + if changeCtx != nil { + p.index = changeCtx.RaftIndex + return changeCtx.RaftIndex, nil + } + + return 0, errors.New("could not locate raft index from MutateContext") +} + +func (p *RaftIndexProvider) CurrentIndex() uint64 { + p.lock.Lock() + defer p.lock.Unlock() + + return p.index +} + +// constraintToIndexedEvents allows constraint events to be converted to events that provide the end state of an +// entity and the index it was modified on. In non-HA scenarios, the index should be a locally tracked integer. +// In HA scenarios, it should be the index from the event store. Constraint events are used as they provide +// access to the HA raft index. +type constraintToIndexedEvents[E boltz.Entity] struct { + indexProvider IndexProvider + + createHandler func(uint64, E) + updateHandler func(uint64, E) + deleteHandler func(uint64, E) +} + +// ProcessPreCommit is a pass through to satisfy interface requirements. +func (h *constraintToIndexedEvents[E]) ProcessPreCommit(_ *boltz.EntityChangeState[E]) error { + return nil +} + +func (h *constraintToIndexedEvents[E]) ProcessPostCommit(state *boltz.EntityChangeState[E]) { + switch state.ChangeType { + case boltz.EntityCreated: + if h.createHandler != nil { + index, err := h.indexProvider.NextIndex(state.Ctx) + + if err != nil { + pfxlog.Logger().WithError(err).Errorf("could not process post commit create for %T, could not aquire index", state.FinalState) + return + } + + h.createHandler(index, state.FinalState) + } + case boltz.EntityUpdated: + if h.updateHandler != nil { + index, err := h.indexProvider.NextIndex(state.Ctx) + + if err != nil { + pfxlog.Logger().WithError(err).Errorf("could not process post commit update for %T, could not aquire index", state.FinalState) + return + } + + h.updateHandler(index, state.FinalState) + } + case boltz.EntityDeleted: + if h.deleteHandler != nil { + index, err := h.indexProvider.NextIndex(state.Ctx) + + if err != nil { + pfxlog.Logger().WithError(err).Errorf("could not process post commit delete for %T, could not aquire index", state.FinalState) + return + } + + //initial state for delete has the actual value, final state is nil + h.deleteHandler(index, state.InitialState) + } + } +} diff --git a/doc/ha/ctrl1.yml b/doc/ha/ctrl1.yml index 23bec8d45..939c5b79f 100644 --- a/doc/ha/ctrl1.yml +++ b/doc/ha/ctrl1.yml @@ -50,3 +50,4 @@ web: - binding: fabric - binding: edge-management - binding: edge-client + - binding: edge-oidc diff --git a/doc/ha/ctrl2.yml b/doc/ha/ctrl2.yml index b5fe79b96..ffce4c134 100644 --- a/doc/ha/ctrl2.yml +++ b/doc/ha/ctrl2.yml @@ -39,3 +39,4 @@ web: - binding: fabric - binding: edge-management - binding: edge-client + - binding: edge-oidc diff --git a/doc/ha/ctrl3.yml b/doc/ha/ctrl3.yml index 60bed20fb..6077096cf 100644 --- a/doc/ha/ctrl3.yml +++ b/doc/ha/ctrl3.yml @@ -39,3 +39,4 @@ web: - binding: fabric - binding: edge-management - binding: edge-client + - binding: edge-oidc diff --git a/doc/ha/overview.md b/doc/ha/overview.md index fc059bcfa..6d050076e 100644 --- a/doc/ha/overview.md +++ b/doc/ha/overview.md @@ -292,3 +292,35 @@ distributed over time. ### Api Sessions, Sessions, Posture Data API Sessions and Sessions are moving to bearer tokens. Posture Data is TBD. + +## A New Authentication API + +A new API for authentication has been created. It is separate from the management, client, and +fabric APIs. It is meant to become the single and only authentication API for OpenZiti networks. +All new HA enabled SDKs make use of it going forward. The legacy authentication APIs will be +considered deprecated. + +The new "Edge OIDC" API implements OpenID Connect - which is a subset of OAuth 2.0 specifically +used for authentication. The API supports a native Code PKCE flow only. The result of authentication +is now JWTs that follow standard OIDC expiration and refresh patterns. + +Enabling the new authentication API is done by added the API's binding, `edge-oidc` to an existing `bindPoint` +in the `web` section. In the following example, the last line enables the `edge-oidc` API. + +``` +web: + - name: all-apis-localhost + bindPoints: + - interface: 127.0.0.1:1280 + address: 127.0.0.1:1280 + options: + minTLSVersion: TLS1.2 + maxTLSVersion: TLS1.3 + apis: + - binding: health-checks + - binding: fabric + - binding: edge-management + - binding: edge-client + - binding: edge-oidc + +``` diff --git a/etc/ctrl.with.edge.yml b/etc/ctrl.with.edge.yml index e99568d77..3e7405077 100644 --- a/etc/ctrl.with.edge.yml +++ b/etc/ctrl.with.edge.yml @@ -241,6 +241,12 @@ web: options: { } - binding: edge-client options: { } + - binding: edge-oidc + options: + redirectURIs: + - "http://localhost:*/auth/callback" + - "http://127.0.0.1:*/auth/callback" + - "https://oauth.pstmn.io/v1/callback" commandRateLimiter: enabled: true diff --git a/router/config.go b/router/config.go index 29340436a..5f8db610b 100644 --- a/router/config.go +++ b/router/config.go @@ -61,6 +61,8 @@ const ( // CtrlEndpointBindMapKey is the string key for the ctrl.bind section CtrlEndpointBindMapKey = "bind" + + CtrlHaMapKey = "ha" ) // internalConfigKeys is used to distinguish internally defined configuration vs file configuration @@ -141,6 +143,9 @@ type Config struct { InitialDelay time.Duration } } + Ha struct { + Enabled bool + } Proxy *transport.ProxyConfiguration Plugins []string src map[interface{}]interface{} @@ -764,6 +769,16 @@ func LoadConfig(path string) (*Config, error) { } } + if value, found := cfgmap[CtrlHaMapKey]; found { + if haMap, ok := value.(map[interface{}]interface{}); ok { + if enabledValue, found := haMap["enabled"]; found { + if enabled, ok := enabledValue.(bool); ok { + cfg.Ha.Enabled = enabled + } + } + } + } + return cfg, nil } diff --git a/router/debugops/debugops.go b/router/debugops/debugops.go index fa783b273..6666fe842 100644 --- a/router/debugops/debugops.go +++ b/router/debugops/debugops.go @@ -1,14 +1,14 @@ package debugops import ( - "github.com/openziti/ziti/router/fabric" "github.com/openziti/ziti/router" + "github.com/openziti/ziti/router/state" ) const ( DumpApiSessions byte = 128 ) -func RegisterEdgeRouterAgentOps(router *router.Router, sm fabric.StateManager, debugEnabled bool) { +func RegisterEdgeRouterAgentOps(router *router.Router, sm state.Manager, debugEnabled bool) { router.RegisterAgentOp(DumpApiSessions, sm.DumpApiSessions) } diff --git a/router/handler_edge_ctrl/apiSessionAdded.go b/router/handler_edge_ctrl/apiSessionAdded.go index 54866c2d6..b19f7e787 100644 --- a/router/handler_edge_ctrl/apiSessionAdded.go +++ b/router/handler_edge_ctrl/apiSessionAdded.go @@ -30,14 +30,14 @@ import ( "github.com/openziti/ziti/common/pb/edge_ctrl_pb" "github.com/openziti/ziti/controller/env" "github.com/openziti/ziti/controller/sync_strats" - "github.com/openziti/ziti/router/fabric" + "github.com/openziti/ziti/router/state" "github.com/sirupsen/logrus" "google.golang.org/protobuf/proto" ) type apiSessionAddedHandler struct { control channel.Channel - sm fabric.StateManager + sm state.Manager syncTracker *apiSessionSyncTracker reqChan chan *apiSessionAddedWithState @@ -47,7 +47,7 @@ type apiSessionAddedHandler struct { trackerLock sync.Mutex } -func NewApiSessionAddedHandler(sm fabric.StateManager, binding channel.Binding) *apiSessionAddedHandler { +func NewApiSessionAddedHandler(sm state.Manager, binding channel.Binding) *apiSessionAddedHandler { handler := &apiSessionAddedHandler{ control: binding.GetChannel(), sm: sm, diff --git a/router/handler_edge_ctrl/apiSessionRemoved.go b/router/handler_edge_ctrl/apiSessionRemoved.go index b89755d9d..c86433456 100644 --- a/router/handler_edge_ctrl/apiSessionRemoved.go +++ b/router/handler_edge_ctrl/apiSessionRemoved.go @@ -21,15 +21,15 @@ import ( "github.com/openziti/channel/v2" "github.com/openziti/ziti/common/pb/edge_ctrl_pb" "github.com/openziti/ziti/controller/env" - "github.com/openziti/ziti/router/fabric" + "github.com/openziti/ziti/router/state" "google.golang.org/protobuf/proto" ) type apiSessionRemovedHandler struct { - sm fabric.StateManager + sm state.Manager } -func NewApiSessionRemovedHandler(sm fabric.StateManager) *apiSessionRemovedHandler { +func NewApiSessionRemovedHandler(sm state.Manager) *apiSessionRemovedHandler { return &apiSessionRemovedHandler{ sm: sm, } diff --git a/router/handler_edge_ctrl/apiSessionUpdated.go b/router/handler_edge_ctrl/apiSessionUpdated.go index 7de7d5358..1ac59da71 100644 --- a/router/handler_edge_ctrl/apiSessionUpdated.go +++ b/router/handler_edge_ctrl/apiSessionUpdated.go @@ -21,15 +21,15 @@ import ( "github.com/openziti/channel/v2" "github.com/openziti/ziti/common/pb/edge_ctrl_pb" "github.com/openziti/ziti/controller/env" - "github.com/openziti/ziti/router/fabric" + "github.com/openziti/ziti/router/state" "google.golang.org/protobuf/proto" ) type apiSessionUpdatedHandler struct { - sm fabric.StateManager + sm state.Manager } -func NewApiSessionUpdatedHandler(sm fabric.StateManager) *apiSessionUpdatedHandler { +func NewApiSessionUpdatedHandler(sm state.Manager) *apiSessionUpdatedHandler { return &apiSessionUpdatedHandler{ sm: sm, } diff --git a/router/handler_edge_ctrl/dataState.go b/router/handler_edge_ctrl/dataState.go new file mode 100644 index 000000000..a6423bb41 --- /dev/null +++ b/router/handler_edge_ctrl/dataState.go @@ -0,0 +1,43 @@ +package handler_edge_ctrl + +import ( + "github.com/michaelquigley/pfxlog" + "github.com/openziti/channel/v2" + "github.com/openziti/ziti/common" + "github.com/openziti/ziti/common/pb/edge_ctrl_pb" + controllerEnv "github.com/openziti/ziti/controller/env" + "github.com/openziti/ziti/router/state" + "google.golang.org/protobuf/proto" +) + +type DataStateHandler struct { + state state.Manager +} + +func NewDataStateHandler(state state.Manager) *DataStateHandler { + return &DataStateHandler{ + state: state, + } +} + +func (*DataStateHandler) ContentType() int32 { + return controllerEnv.DataStateType +} + +func (dsh *DataStateHandler) HandleReceive(msg *channel.Message, ch channel.Channel) { + newState := &edge_ctrl_pb.DataState{} + if err := proto.Unmarshal(msg.Body, newState); err != nil { + pfxlog.Logger().WithError(err).Errorf("could not marshal data state event message") + return + } + + model := common.NewReceiverRouterDataModel(state.RouterDataModelListerBufferSize) + + pfxlog.Logger().WithField("endIndex", newState.EndIndex).Debug("received full router data model state") + for _, event := range newState.Events { + model.Handle(event) + } + + model.SetCurrentIndex(newState.EndIndex) + dsh.state.SetRouterDataModel(model) +} diff --git a/router/handler_edge_ctrl/dataStateEvent.go b/router/handler_edge_ctrl/dataStateEvent.go new file mode 100644 index 000000000..7585d8fe0 --- /dev/null +++ b/router/handler_edge_ctrl/dataStateEvent.go @@ -0,0 +1,35 @@ +package handler_edge_ctrl + +import ( + "github.com/michaelquigley/pfxlog" + "github.com/openziti/channel/v2" + "github.com/openziti/ziti/common/pb/edge_ctrl_pb" + controllerEnv "github.com/openziti/ziti/controller/env" + "github.com/openziti/ziti/router/state" + "google.golang.org/protobuf/proto" +) + +type dataStateEventHandler struct { + state state.Manager +} + +func NewDataStateEventHandler(state state.Manager) channel.TypedReceiveHandler { + return &dataStateEventHandler{ + state: state, + } +} + +func (eventHandler *dataStateEventHandler) HandleReceive(msg *channel.Message, ch channel.Channel) { + newEvent := &edge_ctrl_pb.DataState_Event{} + if err := proto.Unmarshal(msg.Body, newEvent); err != nil { + pfxlog.Logger().WithError(err).Errorf("could not marshal data state event message") + return + } + + model := eventHandler.state.RouterDataModel() + model.Apply(newEvent) +} + +func (*dataStateEventHandler) ContentType() int32 { + return controllerEnv.DataStateEventType +} diff --git a/router/handler_edge_ctrl/hello.go b/router/handler_edge_ctrl/hello.go index fcbec9d34..45a0d3156 100644 --- a/router/handler_edge_ctrl/hello.go +++ b/router/handler_edge_ctrl/hello.go @@ -25,7 +25,7 @@ import ( "github.com/openziti/ziti/common/build" "github.com/openziti/ziti/common/pb/edge_ctrl_pb" "github.com/openziti/ziti/controller/env" - "github.com/openziti/ziti/router/fabric" + "github.com/openziti/ziti/router/state" "google.golang.org/protobuf/proto" ) @@ -36,10 +36,10 @@ type helloHandler struct { hostname string supportedProtocols []string protocolPorts []string - stateManager fabric.StateManager + stateManager state.Manager } -func NewHelloHandler(stateManager fabric.StateManager, listeners []*edge_ctrl_pb.Listener) *helloHandler { +func NewHelloHandler(stateManager state.Manager, listeners []*edge_ctrl_pb.Listener) *helloHandler { //supportedProtocols, protocolPorts, and hostname is for backwards compatibility with v0.26.3 and older controllers var supportedProtocols []string var protocolPorts []string @@ -76,30 +76,34 @@ func (h *helloHandler) ContentType() int32 { func (h *helloHandler) HandleReceive(msg *channel.Message, ch channel.Channel) { go func() { + serverHello := &edge_ctrl_pb.ServerHello{} if err := proto.Unmarshal(msg.Body, serverHello); err == nil { pfxlog.Logger().Info("received server hello, replying") - byteData := serverHello.ByteData[edge_ctrl_pb.SignerPublicCertsHeader] - - if byteData != nil { - signerCerts := &edge_ctrl_pb.SignerCerts{} - if err := proto.Unmarshal(byteData, signerCerts); err == nil { - h.stateManager.AddSignerPublicCert(signerCerts.Keys) - } else { - pfxlog.Logger().WithError(err).Error("could not unmarshal public key signers") - } - } - clientHello := &edge_ctrl_pb.ClientHello{ - Version: build.GetBuildInfo().Version(), - Listeners: h.listeners, - + Version: build.GetBuildInfo().Version(), + Listeners: h.listeners, Hostname: h.hostname, Protocols: h.supportedProtocols, ProtocolPorts: h.protocolPorts, + Data: map[string]string{}, } - if err := protobufs.MarshalTyped(clientHello).ReplyTo(msg).Send(ch); err != nil { + + outMsg := protobufs.MarshalTyped(clientHello).ToSendable().Msg() + + if h.stateManager.GetConfig().Ha.Enabled { + if supported, ok := msg.Headers.GetBoolHeader(int32(edge_ctrl_pb.Header_RouterDataModel)); ok && supported { + + outMsg.Headers.PutBoolHeader(int32(edge_ctrl_pb.Header_RouterDataModel), true) + + if index, ok := h.stateManager.RouterDataModel().CurrentIndex(); ok { + outMsg.Headers.PutUint64Header(int32(edge_ctrl_pb.Header_RouterDataModelIndex), index) + } + } + } + + if err := outMsg.ReplyTo(msg).Send(ch); err != nil { pfxlog.Logger().WithError(err).Error("could not send client hello") } return diff --git a/router/handler_edge_ctrl/sessionRemoved.go b/router/handler_edge_ctrl/sessionRemoved.go index 324cf6b68..3ba666007 100644 --- a/router/handler_edge_ctrl/sessionRemoved.go +++ b/router/handler_edge_ctrl/sessionRemoved.go @@ -21,15 +21,15 @@ import ( "github.com/openziti/channel/v2" "github.com/openziti/ziti/common/pb/edge_ctrl_pb" "github.com/openziti/ziti/controller/env" - "github.com/openziti/ziti/router/fabric" + "github.com/openziti/ziti/router/state" "google.golang.org/protobuf/proto" ) type sessionRemovedHandler struct { - sm fabric.StateManager + sm state.Manager } -func NewSessionRemovedHandler(sm fabric.StateManager) *sessionRemovedHandler { +func NewSessionRemovedHandler(sm state.Manager) *sessionRemovedHandler { return &sessionRemovedHandler{ sm: sm, } diff --git a/router/handler_edge_ctrl/signingCertAdded.go b/router/handler_edge_ctrl/signingCertAdded.go deleted file mode 100644 index 2c2c60dc2..000000000 --- a/router/handler_edge_ctrl/signingCertAdded.go +++ /dev/null @@ -1,33 +0,0 @@ -package handler_edge_ctrl - -import ( - "github.com/michaelquigley/pfxlog" - "github.com/openziti/channel/v2" - "github.com/openziti/ziti/common/pb/edge_ctrl_pb" - "github.com/openziti/ziti/controller/env" - "github.com/openziti/ziti/router/fabric" - "google.golang.org/protobuf/proto" -) - -type signingCertAddedHandler struct { - state fabric.StateManager -} - -func NewSigningCertAddedHandler(state fabric.StateManager) *signingCertAddedHandler { - return &signingCertAddedHandler{ - state: state, - } -} - -func (h *signingCertAddedHandler) ContentType() int32 { - return env.SigningCertAdded -} - -func (h *signingCertAddedHandler) HandleReceive(msg *channel.Message, ch channel.Channel) { - signingCerts := &edge_ctrl_pb.SignerCerts{} - if err := proto.Unmarshal(msg.Body, signingCerts); err == nil { - h.state.AddSignerPublicCert(signingCerts.Keys) - } else { - pfxlog.Logger().WithError(err).Errorf("could not marshal signing certs message") - } -} diff --git a/router/internal/edgerouter/config.go b/router/internal/edgerouter/config.go index b35095184..ccea8b185 100644 --- a/router/internal/edgerouter/config.go +++ b/router/internal/edgerouter/config.go @@ -47,6 +47,7 @@ const ( ) type Config struct { + FilePath string Enabled bool ApiProxy ApiProxy EdgeListeners []*edge_ctrl_pb.Listener @@ -60,6 +61,9 @@ type Config struct { RouterConfig *router.Config EnrollmentIdentityConfig *identity.Config + + Db string + DbSaveInterval time.Duration } type Csr struct { @@ -132,6 +136,33 @@ func (config *Config) LoadConfigFromMap(configMap map[interface{}]interface{}) e return err } + if val, found := edgeConfigMap["db"]; found { + config.Db = val.(string) + } + + if config.Db == "" { + config.Db = "./db.json.gzip" + + if value, found := configMap[router.PathMapKey]; found { + configPath := value.(string) + configPath = strings.TrimSpace(configPath) + config.Db = configPath + ".json.gzip" + } else { + pfxlog.Logger().Warn("the db property was not set, using default for cached data model: %s", config.Db) + } + + pfxlog.Logger().Infof("cached data modile file set to: %s", config.Db) + } + + if val, found := edgeConfigMap["dbSaveIntervalSeconds"]; found { + seconds := val.(int) + config.DbSaveInterval = time.Duration(seconds) * time.Second + } + + if config.DbSaveInterval < 30*time.Second { + config.DbSaveInterval = 30 * time.Second + } + if val, found := edgeConfigMap["heartbeatIntervalSeconds"]; found { config.HeartbeatIntervalSeconds = val.(int) } diff --git a/router/posture/access.go b/router/posture/access.go new file mode 100644 index 000000000..c5b37665d --- /dev/null +++ b/router/posture/access.go @@ -0,0 +1,67 @@ +package posture + +import ( + "fmt" + "github.com/michaelquigley/pfxlog" + "github.com/openziti/ziti/common" + "github.com/openziti/ziti/common/eid" + "github.com/openziti/ziti/common/pb/edge_ctrl_pb" +) + +func HasAccess(rdm *common.RouterDataModel, identityId string, serviceId string, cache *Cache) (*edge_ctrl_pb.DataState_ServicePolicy, error) { + log := pfxlog.Logger().WithField("instance", eid.New()).WithField("identityId", identityId).WithField("serviceId", serviceId) + + accessPolicies, err := rdm.GetServiceAccessPolicies(identityId, serviceId) + + if err != nil { + log.WithError(err).Debug("could not find access path for authorization checks") + return nil, err + } + + if accessPolicies == nil || len(accessPolicies.Policies) == 0 { + return nil, &NoPoliciesError{} + } + + grantingPolicy, errs := IsPassing(accessPolicies, cache) + + if errs != nil && len(*errs) > 0 { + log.Debug("policies provided access but posture checks failed") + return nil, errs + } + + log.Debugf("access provided via policy %s [%s]", grantingPolicy.Name, grantingPolicy.Id) + return grantingPolicy, errs +} + +func IsPassing(accessPolicies *common.AccessPolicies, cache *Cache) (*edge_ctrl_pb.DataState_ServicePolicy, *PolicyAccessErrors) { + errs := &PolicyAccessErrors{} + + for _, policy := range accessPolicies.Policies { + policyErr := &PolicyAccessError{ + Id: policy.Id, + Name: policy.Name, + Errors: []error{}, + } + + for _, postureCheckId := range policy.PostureCheckIds { + postureCheck, ok := accessPolicies.PostureChecks[postureCheckId] + + if !ok || postureCheck == nil { + policyErr.Errors = append(policyErr.Errors, fmt.Errorf("posture check id %s not found model", postureCheckId)) + continue + } + + if err := EvaluatePostureCheck(postureCheck, cache); err != nil { + policyErr.Errors = append(policyErr.Errors, err) + } + } + + if len(policyErr.Errors) == 0 { + return policy, nil + } else { + *errs = append(*errs, policyErr) + } + } + + return nil, errs +} diff --git a/router/posture/checks.go b/router/posture/checks.go new file mode 100644 index 000000000..a9745a0b3 --- /dev/null +++ b/router/posture/checks.go @@ -0,0 +1,68 @@ +package posture + +import ( + "github.com/openziti/sdk-golang/pb/edge_client_pb" + "github.com/openziti/ziti/common/pb/edge_ctrl_pb" + "time" +) + +type Cache struct { + Os *edge_client_pb.PostureResponse_Os + Domain *edge_client_pb.PostureResponse_Domain + Macs *edge_client_pb.PostureResponse_Macs + Unlocked *edge_client_pb.PostureResponse_Unlocked + Woken *edge_client_pb.PostureResponse_Woken + ProcessList *edge_client_pb.PostureResponse_ProcessList + PassedMfaAt *time.Time +} + +type Check interface { + Evaluate(state *Cache) *CheckError +} + +func CtrlCheckToLogic(postureCheck *edge_ctrl_pb.DataState_PostureCheck) Check { + switch subCheck := postureCheck.Subtype.(type) { + case *edge_ctrl_pb.DataState_PostureCheck_Mac_: + return &MacCheck{ + DataState_PostureCheck: postureCheck, + DataState_PostureCheck_Mac: subCheck.Mac, + } + case *edge_ctrl_pb.DataState_PostureCheck_OsList_: + return &OsCheck{ + DataState_PostureCheck: postureCheck, + DataState_PostureCheck_OsList: subCheck.OsList, + } + case *edge_ctrl_pb.DataState_PostureCheck_Process_: + return &ProcessCheck{ + DataState_PostureCheck: postureCheck, + DataState_PostureCheck_ProcessMulti: &edge_ctrl_pb.DataState_PostureCheck_ProcessMulti{ + Semantic: "AllOf", + Processes: []*edge_ctrl_pb.DataState_PostureCheck_Process{ + { + OsType: subCheck.Process.OsType, + Path: subCheck.Process.Path, + Hashes: subCheck.Process.Hashes, + Fingerprints: subCheck.Process.Fingerprints, + }, + }, + }, + } + case *edge_ctrl_pb.DataState_PostureCheck_ProcessMulti_: + return &ProcessCheck{ + DataState_PostureCheck: postureCheck, + DataState_PostureCheck_ProcessMulti: subCheck.ProcessMulti, + } + case *edge_ctrl_pb.DataState_PostureCheck_Domains_: + return &DomainCheck{ + DataState_PostureCheck: postureCheck, + DataState_PostureCheck_Domains: subCheck.Domains, + } + case *edge_ctrl_pb.DataState_PostureCheck_Mfa_: + return &MfaCheck{ + DataState_PostureCheck: postureCheck, + DataState_PostureCheck_Mfa: subCheck.Mfa, + } + } + + return nil +} diff --git a/router/posture/domain.go b/router/posture/domain.go new file mode 100644 index 000000000..f85d254b9 --- /dev/null +++ b/router/posture/domain.go @@ -0,0 +1,42 @@ +package posture + +import ( + "github.com/openziti/ziti/common/pb/edge_ctrl_pb" +) + +type DomainCheck struct { + *edge_ctrl_pb.DataState_PostureCheck + *edge_ctrl_pb.DataState_PostureCheck_Domains +} + +func (m *DomainCheck) Evaluate(state *Cache) *CheckError { + if state == nil { + return &CheckError{ + Id: m.Id, + Name: m.Name, + Cause: NilStateError, + } + } + + notInListErr := &AnyInListError[Str]{ + GivenValues: []Str{Str(state.Domain.Name)}, + } + + for _, domain := range m.Domains { + if state.Domain.Name != domain { + notInListErr.FailedValues = append(notInListErr.FailedValues, FailedValueError[Str]{ + ExpectedValue: Str(domain), + GivenValue: Str(state.Domain.Name), + Reason: NotEqualError, + }) + } else { + return nil + } + } + + return &CheckError{ + Id: m.Id, + Name: m.Name, + Cause: notInListErr, + } +} diff --git a/router/posture/errors.go b/router/posture/errors.go new file mode 100644 index 000000000..a79e377a1 --- /dev/null +++ b/router/posture/errors.go @@ -0,0 +1,164 @@ +package posture + +import ( + "fmt" + "github.com/openziti/ziti/common/pb/edge_ctrl_pb" + "github.com/pkg/errors" +) + +type CheckError struct { + Id string + Name string + Cause error +} + +func (p *CheckError) Error() string { + return fmt.Sprintf("posture check %s [%s] failed due to error(s): %s", p.Name, p.Id, p.Cause.Error()) +} + +type NoPoliciesError struct { +} + +func (e *NoPoliciesError) Error() string { + return "no policies provide access" +} + +type PolicyAccessError struct { + Id string + Name string + Errors []error +} + +func (p *PolicyAccessError) Error() string { + if len(p.Errors) == 0 { + return fmt.Sprintf("policy %s [%s] failed", p.Id, p.Name) + } + + subErrStr := "" + for i, err := range p.Errors { + if i == 0 { + subErrStr = err.Error() + } else { + subErrStr = subErrStr + ", " + err.Error() + } + } + return fmt.Sprintf("policy %s [%s] failed due to %d error(s): %s", p.Name, p.Id, len(p.Errors), subErrStr) +} + +type PolicyAccessErrors []*PolicyAccessError + +func (pae *PolicyAccessErrors) Error() string { + if pae == nil || len(*pae) == 0 { + return "unknown policy failure" + } + + subErr := "" + + for i, err := range *pae { + if i == 0 { + subErr = err.Error() + } else { + subErr = subErr + ", " + err.Error() + } + } + + return fmt.Sprintf("%d policies failed: %s", len(*pae), subErr) +} + +func EvaluatePostureCheck(postureCheck *edge_ctrl_pb.DataState_PostureCheck, cache *Cache) *CheckError { + check := CtrlCheckToLogic(postureCheck) + return check.Evaluate(cache) +} + +// FailedValueError represents a complex object comparison that failed. If a simple comparison failure is needed +// (i.e. bool != bool, string != string) use an `error` instead. +type FailedValueError[V fmt.Stringer] struct { + ExpectedValue V + GivenValue V + Reason error +} + +func (v *FailedValueError[V]) String() string { + return fmt.Sprintf("the state did not match because %v, expected: %s, given: %s", v.Reason, v.ExpectedValue, v.GivenValue) +} + +func (v *FailedValueError[V]) Error() string { + return v.String() +} + +// AllInListError indicates that a given array of expected values had one or more values that did not match/pass. +// GivenValues represents all values supplied to match the expected values. FailedValues represents all the expected +// values that did not pass. +type AllInListError[V fmt.Stringer] struct { + FailedValues []FailedValueError[V] + GivenValues []V +} + +func (e *AllInListError[V]) Error() string { + var failureStrings []string + + for _, failedValue := range e.FailedValues { + failureStrings = append(failureStrings, failedValue.String()) + } + + valueStr := "" + + for i, v := range e.GivenValues { + if i == 0 { + valueStr = fmt.Sprintf("%v", v) + } else { + valueStr = valueStr + ", " + fmt.Sprintf("%v", v) + } + } + + return fmt.Sprintf("all values must be valid have at least one failure, have: %s, failed for: %v", valueStr, failureStrings) +} + +// AnyInListError represents the fact that zero expected values did not match/pass where at least one was required. +// GivenValues represents all values supplied to match the expected values. FailedValues represents all the expected +// values that did not pass. +type AnyInListError[V fmt.Stringer] struct { + FailedValues []FailedValueError[V] + GivenValues []V +} + +func (e *AnyInListError[V]) Error() string { + var failureStrings []string + + for _, failedValue := range e.FailedValues { + failureStrings = append(failureStrings, failedValue.String()) + } + + valueStr := "" + + for i, v := range e.GivenValues { + if i == 0 { + valueStr = fmt.Sprintf("%v", v) + } else { + valueStr = valueStr + ", " + fmt.Sprintf("%v", v) + } + } + + return fmt.Sprintf("one valid values is required, got 0, have: %s, failed for: %v", valueStr, failureStrings) +} + +// OneInListError represents two arrays of values where one of the supplied GivenValues must be in the ValidValues. +// Used when a large cross join of values (i.e. mac address approve/deny lists) would be reported for every comparison. +type OneInListError[V fmt.Stringer] struct { + ValidValues []V + GivenValues []V +} + +func (e *OneInListError[V]) Error() string { + return fmt.Sprintf("none of the given values were in the valid values, given: %v, valid: %v", e.GivenValues, e.ValidValues) +} + +type Str string + +func (s Str) String() string { + return string(s) +} + +var NilStateError = errors.New("posture state was nil") + +var NotEqualError = errors.New("the values were not equal") diff --git a/router/posture/mac.go b/router/posture/mac.go new file mode 100644 index 000000000..9d118d53f --- /dev/null +++ b/router/posture/mac.go @@ -0,0 +1,47 @@ +package posture + +import ( + "github.com/openziti/ziti/common/pb/edge_ctrl_pb" +) + +type MacCheck struct { + *edge_ctrl_pb.DataState_PostureCheck + *edge_ctrl_pb.DataState_PostureCheck_Mac +} + +func (m MacCheck) Evaluate(state *Cache) *CheckError { + if state == nil { + return &CheckError{ + Id: m.Id, + Name: m.Name, + Cause: NilStateError, + } + } + + notInListErr := &OneInListError[Str]{} + + macMap := map[string]struct{}{} + for _, macAddresses := range state.Macs.Addresses { + macMap[macAddresses] = struct{}{} + } + + for _, macAddress := range m.MacAddresses { + if _, ok := macMap[macAddress]; ok { + return nil + } + } + + for _, mac := range m.MacAddresses { + notInListErr.ValidValues = append(notInListErr.ValidValues, Str(mac)) + } + + for _, mac := range state.Macs.Addresses { + notInListErr.GivenValues = append(notInListErr.GivenValues, Str(mac)) + } + + return &CheckError{ + Id: m.Id, + Name: m.Name, + Cause: notInListErr, + } +} diff --git a/router/posture/mfa.go b/router/posture/mfa.go new file mode 100644 index 000000000..65049caba --- /dev/null +++ b/router/posture/mfa.go @@ -0,0 +1,79 @@ +package posture + +import ( + "fmt" + "github.com/openziti/ziti/common/pb/edge_ctrl_pb" + "github.com/pkg/errors" + "time" +) + +const ( + NoTimeout = int64(-1) + PromptGracePeriod = 5 * time.Minute +) + +type MfaCheck struct { + *edge_ctrl_pb.DataState_PostureCheck + *edge_ctrl_pb.DataState_PostureCheck_Mfa +} + +func (m *MfaCheck) Evaluate(state *Cache) *CheckError { + now := time.Now() + + if state == nil { + return &CheckError{ + Id: m.Id, + Name: m.Name, + Cause: NilStateError, + } + } + + if state.PassedMfaAt == nil { + return &CheckError{ + Id: m.Id, + Name: m.Name, + Cause: errors.New("MFA has never been passed"), + } + } + + if m.TimeoutSeconds != NoTimeout { + timeout := time.Duration(m.TimeoutSeconds) * time.Second + timedOut := state.PassedMfaAt.Add(timeout).Before(time.Now()) + + if timedOut { + return &CheckError{ + Id: m.Id, + Name: m.Name, + Cause: fmt.Errorf("last MFA check exceeded timeout of %s, last mfa at %s, checked at %s", timeout.String(), state.PassedMfaAt.String(), now.String()), + } + } + } + + if m.PromptOnWake { + wokenAt := state.Woken.Time.AsTime() + wokenGraceEndsAt := wokenAt.Add(PromptGracePeriod) + + if now.After(wokenGraceEndsAt) { + return &CheckError{ + Id: m.Id, + Name: m.Name, + Cause: fmt.Errorf("MFA not resupplied during grace period, woken at %s, grace period: %s, supplied at %s, checked at: %s", wokenAt.String(), PromptGracePeriod.String(), state.PassedMfaAt.String(), now.String()), + } + } + } + + if m.PromptOnUnlock { + unlockedAt := state.Unlocked.Time.AsTime() + unlockedGraceEndsAt := unlockedAt.Add(PromptGracePeriod) + + if now.After(unlockedGraceEndsAt) { + return &CheckError{ + Id: m.Id, + Name: m.Name, + Cause: fmt.Errorf("MFA not resupplied during grace period, unlocked at %s, grace period: %s, supplied at %s, checked at: %s", unlockedAt.String(), PromptGracePeriod.String(), state.PassedMfaAt.String(), now.String()), + } + } + } + + return nil +} diff --git a/router/posture/os.go b/router/posture/os.go new file mode 100644 index 000000000..d1d6db104 --- /dev/null +++ b/router/posture/os.go @@ -0,0 +1,12 @@ +package posture + +import "github.com/openziti/ziti/common/pb/edge_ctrl_pb" + +type OsCheck struct { + *edge_ctrl_pb.DataState_PostureCheck + *edge_ctrl_pb.DataState_PostureCheck_OsList +} + +func (m *OsCheck) Evaluate(state *Cache) *CheckError { + return nil +} diff --git a/router/posture/process.go b/router/posture/process.go new file mode 100644 index 000000000..0f862b807 --- /dev/null +++ b/router/posture/process.go @@ -0,0 +1,184 @@ +package posture + +import ( + "fmt" + "github.com/michaelquigley/pfxlog" + "github.com/openziti/foundation/v2/stringz" + "github.com/openziti/sdk-golang/pb/edge_client_pb" + "github.com/openziti/ziti/common/pb/edge_ctrl_pb" + "github.com/openziti/ziti/controller/db" +) + +type ProcessCheck struct { + *edge_ctrl_pb.DataState_PostureCheck + *edge_ctrl_pb.DataState_PostureCheck_ProcessMulti +} + +func (p *ProcessCheck) Evaluate(cache *Cache) *CheckError { + switch p.Semantic { + case db.SemanticAllOf: + return p.requireAll(cache) + case db.SemanticAnyOf: + return p.requireOne(cache) + default: + pfxlog.Logger().Panicf("invalid semantic, expected %s or %s got [%s]", db.SemanticAllOf, db.SemanticAnyOf, p.Semantic) + return nil + } +} + +func (p *ProcessCheck) requireAll(cache *Cache) *CheckError { + if cache == nil { + return &CheckError{ + Id: p.Id, + Name: p.Name, + Cause: NilStateError, + } + } + cacheProcesses := map[string]*edge_client_pb.PostureResponse_Process{} + + for _, process := range cache.ProcessList.Processes { + cacheProcesses[process.Path] = process + } + + allInListError := &AllInListError[*edge_ctrl_pb.DataState_PostureCheck_Process]{} + + for _, process := range p.Processes { + if process.Path == "" { + return &CheckError{ + Id: p.Id, + Name: p.Name, + Cause: fmt.Errorf("invalid path in process check, '%s'", process.Path), + } + } + + cacheProcess, ok := cacheProcesses[process.Path] + + if !ok { + return &CheckError{ + Id: p.Id, + Name: p.Name, + Cause: fmt.Errorf("the process path %s was not found, it hasn't been reported or isn't running on the client", process.Path), + } + } + + failedValue := p.compareProcesses(cache.Os.Os.Type, cacheProcess, process) + + if failedValue != nil { + allInListError.FailedValues = append(allInListError.FailedValues, *failedValue) + } + } + + if len(allInListError.FailedValues) > 0 { + for _, process := range cache.ProcessList.Processes { + allInListError.GivenValues = append(allInListError.GivenValues, &edge_ctrl_pb.DataState_PostureCheck_Process{ + OsType: cache.Os.Os.Type, + Path: process.Path, + Hashes: []string{process.Hash}, + Fingerprints: process.SignerFingerprints, + }) + } + + return &CheckError{ + Id: p.Id, + Name: p.Name, + Cause: allInListError, + } + } + + return nil +} + +func (p *ProcessCheck) requireOne(cache *Cache) *CheckError { + if cache == nil { + return &CheckError{ + Id: p.Id, + Name: p.Name, + Cause: NilStateError, + } + } + cacheProcesses := map[string]*edge_client_pb.PostureResponse_Process{} + + for _, process := range cache.ProcessList.Processes { + cacheProcesses[process.Path] = process + } + + anyInList := &AnyInListError[*edge_ctrl_pb.DataState_PostureCheck_Process]{} + + for _, process := range p.Processes { + cacheProcess := cacheProcesses[process.Path] + + failedValue := p.compareProcesses(cache.Os.Os.Type, cacheProcess, process) + + if failedValue != nil { + anyInList.FailedValues = append(anyInList.FailedValues, *failedValue) + } else { + return nil + } + } + + for _, process := range cache.ProcessList.Processes { + anyInList.GivenValues = append(anyInList.GivenValues, &edge_ctrl_pb.DataState_PostureCheck_Process{ + OsType: cache.Os.Os.Type, + Path: process.Path, + Hashes: []string{process.Hash}, + Fingerprints: process.SignerFingerprints, + }) + } + + return &CheckError{ + Id: p.Id, + Name: p.Name, + Cause: anyInList, + } +} + +func (p *ProcessCheck) compareProcesses(osType string, given *edge_client_pb.PostureResponse_Process, valid *edge_ctrl_pb.DataState_PostureCheck_Process) *FailedValueError[*edge_ctrl_pb.DataState_PostureCheck_Process] { + result := &FailedValueError[*edge_ctrl_pb.DataState_PostureCheck_Process]{ + ExpectedValue: valid, + GivenValue: nil, + Reason: nil, + } + + if given == nil { + result.Reason = fmt.Errorf("no matching process by path %s, the process hasn't been sumitted or isn't running", valid.Path) + return result + } + + if valid.Path != given.Path { + result.Reason = fmt.Errorf("paths do not match, given %s, expected: %s", given.Path, valid.Path) + return result + } + + if valid.OsType != osType { + result.Reason = fmt.Errorf("os types do not match, given %s, expected: %s", osType, valid.OsType) + return result + } + + if len(valid.Hashes) > 0 && !stringz.Contains(valid.Hashes, given.Hash) { + result.Reason = fmt.Errorf("hash is not valid, given %s, expected one of: %v", given.Hash, valid.Hashes) + return result + } + + if len(valid.Fingerprints) > 0 { + validPrints := map[string]struct{}{} + + for _, validPrint := range valid.Fingerprints { + validPrints[validPrint] = struct{}{} + } + + validPrintFound := false + for _, givenPrint := range given.SignerFingerprints { + if _, ok := validPrints[givenPrint]; ok { + validPrintFound = true + break + } + } + + if !validPrintFound { + result.Reason = fmt.Errorf("valid signer not found, given: %v, expected one of: %v", given.SignerFingerprints, valid.Hashes) + return result + } + } + + return nil +} diff --git a/router/fabric/heartbeat.go b/router/state/heartbeat.go similarity index 79% rename from router/fabric/heartbeat.go rename to router/state/heartbeat.go index fde59004b..ba097e2a4 100644 --- a/router/fabric/heartbeat.go +++ b/router/state/heartbeat.go @@ -1,20 +1,20 @@ /* - Copyright NetFoundry Inc. +Copyright NetFoundry Inc. - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at - https://www.apache.org/licenses/LICENSE-2.0 +https://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. */ -package fabric +package state import ( "github.com/michaelquigley/pfxlog" diff --git a/router/fabric/manager.go b/router/state/manager.go similarity index 58% rename from router/fabric/manager.go rename to router/state/manager.go index 5a6888e83..fa0463a2c 100644 --- a/router/fabric/manager.go +++ b/router/state/manager.go @@ -14,27 +14,31 @@ limitations under the License. */ -package fabric +package state import ( "bufio" - "crypto/sha1" + "crypto" "crypto/x509" "fmt" "github.com/golang-jwt/jwt/v5" "github.com/kataras/go-events" "github.com/michaelquigley/pfxlog" "github.com/openziti/channel/v2" + "github.com/openziti/ziti/common" "github.com/openziti/ziti/common/pb/edge_ctrl_pb" "github.com/openziti/ziti/common/runner" "github.com/openziti/ziti/controller/oidc_auth" + "github.com/openziti/ziti/router" "github.com/openziti/ziti/router/env" cmap "github.com/orcaman/concurrent-map/v2" + "github.com/pkg/errors" "github.com/sirupsen/logrus" "google.golang.org/protobuf/proto" "math/rand" "strings" "sync" + "sync/atomic" "time" ) @@ -44,13 +48,15 @@ const ( EventAddedApiSession = "AddedApiSession" EventUpdatedApiSession = "UpdatedApiSession" EventRemovedApiSession = "RemovedApiSession" + + RouterDataModelListerBufferSize = 100 ) type RemoveListener func() type DisconnectCB func(token string) -type StateManager interface { +type Manager interface { //"Network" Sessions RemoveEdgeSession(token string) AddEdgeSessionRemovedListener(token string, callBack func(token string)) RemoveListener @@ -69,7 +75,8 @@ type StateManager interface { RemoveConnectedApiSessionWithChannel(token string, underlay channel.Channel) AddApiSessionRemovedListener(token string, callBack func(token string)) RemoveListener - AddSignerPublicCert(keys [][]byte) + RouterDataModel() *common.RouterDataModel + SetRouterDataModel(model *common.RouterDataModel) StartHeartbeat(env env.RouterEnv, seconds int, closeNotify <-chan struct{}) ValidateSessions(ch channel.Channel, chunkSize uint32, minInterval, maxInterval time.Duration) @@ -78,11 +85,41 @@ type StateManager interface { MarkSyncInProgress(trackerId string) MarkSyncStopped(trackerId string) IsSyncInProgress() bool + + VerifyClientCert(cert *x509.Certificate) error + + StartRouterModelSave(routerEnv env.RouterEnv, path string, duration time.Duration) + LoadRouterModel(filePath string) + + AddActiveChannel(ch channel.Channel, session *ApiSession) + RemoveActiveChannel(ch channel.Channel) + GetApiSessionFromCh(ch channel.Channel) *ApiSession + + GetConfig() *router.Config +} + +var _ Manager = (*ManagerImpl)(nil) + +func NewManager(config *router.Config) Manager { + return &ManagerImpl{ + EventEmmiter: events.New(), + apiSessionsByToken: cmap.New[*edge_ctrl_pb.ApiSession](), + activeApiSessions: cmap.New[*MapWithMutex](), + sessions: cmap.New[uint32](), + recentlyRemovedSessions: cmap.New[time.Time](), + certCache: cmap.New[*x509.Certificate](), + activeChannels: cmap.New[*ApiSession](), + config: config, + } } -type StateManagerImpl struct { - apiSessionsByToken cmap.ConcurrentMap[string, *edge_ctrl_pb.ApiSession] - activeApiSessions cmap.ConcurrentMap[string, *MapWithMutex] +type ManagerImpl struct { + config *router.Config + apiSessionsByToken cmap.ConcurrentMap[string, *edge_ctrl_pb.ApiSession] + + activeApiSessions cmap.ConcurrentMap[string, *MapWithMutex] + activeChannels cmap.ConcurrentMap[string, *ApiSession] + sessions cmap.ConcurrentMap[string, uint32] recentlyRemovedSessions cmap.ConcurrentMap[string, time.Time] @@ -95,43 +132,181 @@ type StateManagerImpl struct { heartbeatOperation *heartbeatOperation currentSync string syncLock sync.Mutex - signerPublicCerts cmap.ConcurrentMap[string, *x509.Certificate] + + certCache cmap.ConcurrentMap[string, *x509.Certificate] + routerDataModel atomic.Pointer[common.RouterDataModel] } -func (sm *StateManagerImpl) AddSignerPublicCert(keys [][]byte) { - added := 0 - ignored := 0 +func (sm *ManagerImpl) GetConfig() *router.Config { + return sm.config +} - for _, key := range keys { - cert, err := x509.ParseCertificate(key) +func (sm *ManagerImpl) GetApiSessionFromCh(ch channel.Channel) *ApiSession { + apiSession, _ := sm.activeChannels.Get(ch.Id()) - if err != nil { - pfxlog.Logger().WithError(err).Error("could not parse signer public key") - continue + return apiSession +} + +func (sm *ManagerImpl) AddActiveChannel(ch channel.Channel, session *ApiSession) { + sm.activeChannels.Set(ch.Id(), session) +} + +func (sm *ManagerImpl) RemoveActiveChannel(ch channel.Channel) { + sm.activeChannels.Remove(ch.Id()) +} + +func (sm *ManagerImpl) StartRouterModelSave(routerEnv env.RouterEnv, filePath string, duration time.Duration) { + go func() { + for { + select { + case <-routerEnv.GetCloseNotify(): + return + case <-time.After(duration): + sm.RouterDataModel().Save(filePath) + } } + }() +} + +func (sm *ManagerImpl) LoadRouterModel(filePath string) { + model, err := common.NewReceiverRouterDataModelFromFile(filePath, RouterDataModelListerBufferSize) - kid := fmt.Sprintf("%x", sha1.Sum(key)) - sm.signerPublicCerts.Upsert(kid, cert, func(exist bool, valueInMap *x509.Certificate, newValue *x509.Certificate) *x509.Certificate { - if exist { - ignored = ignored + 1 - } else { - added = added + 1 + if err != nil { + pfxlog.Logger().WithError(err).Errorf("could not load router model from file [%s]", filePath) + model = common.NewReceiverRouterDataModel(RouterDataModelListerBufferSize) + } + + sm.SetRouterDataModel(model) +} + +func contains[T comparable](values []T, element T) bool { + for _, val := range values { + if val == element { + return true + } + } + + return false +} + +func (sm *ManagerImpl) getX509FromData(kid string, data []byte) (*x509.Certificate, error) { + if cert, found := sm.certCache.Get(kid); found { + return cert, nil + } + + cert, err := x509.ParseCertificate(data) + + if err != nil { + return nil, err + } + + sm.certCache.Set(kid, cert) + + return cert, nil +} + +func (sm *ManagerImpl) VerifyClientCert(cert *x509.Certificate) error { + + rootPool := x509.NewCertPool() + + rdm := sm.routerDataModel.Load() + + for keysTuple := range rdm.PublicKeys.IterBuffered() { + if contains(keysTuple.Val.Usages, edge_ctrl_pb.DataState_PublicKey_ClientX509CertValidation) { + cert, err := sm.getX509FromData(keysTuple.Val.Kid, keysTuple.Val.GetData()) + + if err != nil { + pfxlog.Logger().WithField("kid", keysTuple.Val.Kid).WithError(err).Error("could not parse x509 certificate data") + continue } - return valueInMap - }) + + rootPool.AddCert(cert) + } + } + + opts := x509.VerifyOptions{ + Roots: rootPool, + Intermediates: x509.NewCertPool(), + KeyUsages: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth}, + CurrentTime: cert.NotBefore, } - pfxlog.Logger().WithField("received", len(keys)).WithField("added", added).WithField("ignored", ignored).Info("received signer public certificates") + if _, err := cert.Verify(opts); err != nil { + return fmt.Errorf("could not verify client certificate %w", err) + } + + return nil +} + +func (sm *ManagerImpl) ParseJwt(jwtStr string) (*jwt.Token, *common.AccessClaims, error) { + //pubKeyLookup also handles extJwtSigner.enabled checking + accessClaims := &common.AccessClaims{} + jwtToken, err := jwt.ParseWithClaims(jwtStr, accessClaims, sm.pubKeyLookup) + + if err != nil { + return nil, nil, err + } + + if accessClaims.Type == common.TokenTypeAccess { + return jwtToken, accessClaims, nil + } + + return nil, nil, fmt.Errorf("invalid access token type: %s", accessClaims.Type) +} + +func (sm *ManagerImpl) pubKeyLookup(token *jwt.Token) (any, error) { + kidVal, ok := token.Header["kid"] + + if !ok { + return nil, errors.New("could not lookup JWT signer, kid header missing") + } + + kid, ok := kidVal.(string) + + if !ok { + return nil, fmt.Errorf("kid header value is not a string, got type %T", kidVal) + } + + kid = strings.TrimSpace(kid) + + rdm := sm.routerDataModel.Load() + publicKeys := rdm.PublicKeys.IterBuffered() + for keysTuple := range publicKeys { + if contains(keysTuple.Val.Usages, edge_ctrl_pb.DataState_PublicKey_JWTValidation) { + + if kid == keysTuple.Val.Kid { + return sm.parsePublicKey(keysTuple.Val) + } + } + } + + return nil, errors.New("public key not found") +} + +func (sm *ManagerImpl) RouterDataModel() *common.RouterDataModel { + rdm := sm.routerDataModel.Load() + if rdm == nil { + rdm = common.NewReceiverRouterDataModel(RouterDataModelListerBufferSize) + sm.routerDataModel.Store(rdm) + } + return rdm +} + +func (sm *ManagerImpl) SetRouterDataModel(model *common.RouterDataModel) { + publicKeys := model.PublicKeys.Items() + pfxlog.Logger().Debugf("number of public keys in rdm: %d", len(publicKeys)) + + sm.routerDataModel.Store(model) } -func (sm *StateManagerImpl) MarkSyncInProgress(trackerId string) { +func (sm *ManagerImpl) MarkSyncInProgress(trackerId string) { sm.syncLock.Lock() defer sm.syncLock.Unlock() sm.currentSync = trackerId } -func (sm *StateManagerImpl) MarkSyncStopped(trackerId string) { +func (sm *ManagerImpl) MarkSyncStopped(trackerId string) { sm.syncLock.Lock() defer sm.syncLock.Unlock() if sm.currentSync == trackerId { @@ -139,24 +314,13 @@ func (sm *StateManagerImpl) MarkSyncStopped(trackerId string) { } } -func (sm *StateManagerImpl) IsSyncInProgress() bool { +func (sm *ManagerImpl) IsSyncInProgress() bool { sm.syncLock.Lock() defer sm.syncLock.Unlock() return sm.currentSync == "" } -func NewStateManager() StateManager { - return &StateManagerImpl{ - EventEmmiter: events.New(), - apiSessionsByToken: cmap.New[*edge_ctrl_pb.ApiSession](), - activeApiSessions: cmap.New[*MapWithMutex](), - sessions: cmap.New[uint32](), - recentlyRemovedSessions: cmap.New[time.Time](), - signerPublicCerts: cmap.New[*x509.Certificate](), - } -} - -func (sm *StateManagerImpl) AddApiSession(apiSession *edge_ctrl_pb.ApiSession) { +func (sm *ManagerImpl) AddApiSession(apiSession *edge_ctrl_pb.ApiSession) { pfxlog.Logger(). WithField("apiSessionId", apiSession.Id). WithField("apiSessionToken", apiSession.Token). @@ -166,7 +330,7 @@ func (sm *StateManagerImpl) AddApiSession(apiSession *edge_ctrl_pb.ApiSession) { sm.Emit(EventAddedApiSession, apiSession) } -func (sm *StateManagerImpl) UpdateApiSession(apiSession *edge_ctrl_pb.ApiSession) { +func (sm *ManagerImpl) UpdateApiSession(apiSession *edge_ctrl_pb.ApiSession) { pfxlog.Logger(). WithField("apiSessionId", apiSession.Id). WithField("apiSessionToken", apiSession.Token). @@ -176,7 +340,7 @@ func (sm *StateManagerImpl) UpdateApiSession(apiSession *edge_ctrl_pb.ApiSession sm.Emit(EventUpdatedApiSession, apiSession) } -func (sm *StateManagerImpl) RemoveApiSession(token string) { +func (sm *ManagerImpl) RemoveApiSession(token string) { if ns, ok := sm.apiSessionsByToken.Get(token); ok { pfxlog.Logger().WithField("apiSessionToken", token).Debug("removing api session") sm.apiSessionsByToken.Remove(token) @@ -192,7 +356,7 @@ func (sm *StateManagerImpl) RemoveApiSession(token string) { // RemoveMissingApiSessions removes API Sessions not present in the knownApiSessions argument. If the beforeSessionId // value is not empty string, it will be used as a monotonic comparison between it and API session ids. API session ids // later than the sync will be ignored. -func (sm *StateManagerImpl) RemoveMissingApiSessions(knownApiSessions []*edge_ctrl_pb.ApiSession, beforeSessionId string) { +func (sm *ManagerImpl) RemoveMissingApiSessions(knownApiSessions []*edge_ctrl_pb.ApiSession, beforeSessionId string) { validTokens := map[string]bool{} for _, apiSession := range knownApiSessions { validTokens[apiSession.Token] = true @@ -210,7 +374,7 @@ func (sm *StateManagerImpl) RemoveMissingApiSessions(knownApiSessions []*edge_ct } } -func (sm *StateManagerImpl) RemoveEdgeSession(token string) { +func (sm *ManagerImpl) RemoveEdgeSession(token string) { pfxlog.Logger().WithField("sessionToken", token).Debug("removing network session") eventName := sm.getEdgeSessionRemovedEventName(token) sm.Emit(eventName) @@ -225,7 +389,7 @@ func (sm *StateManagerImpl) RemoveEdgeSession(token string) { } -func (sm *StateManagerImpl) GetApiSessionWithTimeout(token string, timeout time.Duration) *ApiSession { +func (sm *ManagerImpl) GetApiSessionWithTimeout(token string, timeout time.Duration) *ApiSession { deadline := time.Now().Add(timeout) session := sm.GetApiSession(token) @@ -249,16 +413,20 @@ func (sm *StateManagerImpl) GetApiSessionWithTimeout(token string, timeout time. type ApiSession struct { *edge_ctrl_pb.ApiSession JwtToken *jwt.Token - Claims *oidc_auth.AccessClaims + Claims *common.AccessClaims } -func (sm *StateManagerImpl) GetApiSession(token string) *ApiSession { - if strings.HasPrefix(token, oidc_auth.JwtTokenPrefix) { - accessClaims := &oidc_auth.AccessClaims{} - jwtToken, err := jwt.ParseWithClaims(token, accessClaims, sm.keyFunc) +func (sm *ManagerImpl) GetApiSession(token string) *ApiSession { + if sm.config.Ha.Enabled && strings.HasPrefix(token, oidc_auth.JwtTokenPrefix) { + jwtToken, accessClaims, err := sm.ParseJwt(token) if err == nil { - if accessClaims.Type != oidc_auth.TokenTypeAccess { + if !accessClaims.HasAudience(common.ClaimAudienceOpenZiti) { + pfxlog.Logger().Errorf("provided a token with invalid audience '%s', expected: %s", accessClaims.Audience, common.ClaimAudienceOpenZiti) + return nil + } + + if accessClaims.Type != common.TokenTypeAccess { pfxlog.Logger().Errorf("provided a token with invalid type '%s'", accessClaims.Type) return nil } @@ -285,11 +453,11 @@ func (sm *StateManagerImpl) GetApiSession(token string) *ApiSession { return nil } -func (sm *StateManagerImpl) WasSessionRecentlyRemoved(token string) bool { +func (sm *ManagerImpl) WasSessionRecentlyRemoved(token string) bool { return sm.recentlyRemovedSessions.Has(token) } -func (sm *StateManagerImpl) AddEdgeSessionRemovedListener(token string, callBack func(token string)) RemoveListener { +func (sm *ManagerImpl) AddEdgeSessionRemovedListener(token string, callBack func(token string)) RemoveListener { if sm.recentlyRemovedSessions.Has(token) { go callBack(token) // callback can be long process with network traffic. Don't block event processing return func() {} @@ -318,7 +486,7 @@ func (sm *StateManagerImpl) AddEdgeSessionRemovedListener(token string, callBack } } -func (sm *StateManagerImpl) SessionConnectionClosed(token string) { +func (sm *ManagerImpl) SessionConnectionClosed(token string) { sm.sessions.Upsert(token, 0, func(exist bool, valueInMap uint32, newValue uint32) uint32 { if !exist { return uint32(0) @@ -340,7 +508,7 @@ func (sm *StateManagerImpl) SessionConnectionClosed(token string) { }) } -func (sm *StateManagerImpl) AddApiSessionRemovedListener(token string, callBack func(token string)) RemoveListener { +func (sm *ManagerImpl) AddApiSessionRemovedListener(token string, callBack func(token string)) RemoveListener { eventName := sm.getApiSessionRemovedEventName(token) listener := func(args ...interface{}) { callBack(token) @@ -352,17 +520,17 @@ func (sm *StateManagerImpl) AddApiSessionRemovedListener(token string, callBack } } -func (sm *StateManagerImpl) getEdgeSessionRemovedEventName(token string) events.EventName { +func (sm *ManagerImpl) getEdgeSessionRemovedEventName(token string) events.EventName { eventName := EventRemovedEdgeSession + "-" + token return events.EventName(eventName) } -func (sm *StateManagerImpl) getApiSessionRemovedEventName(token string) events.EventName { +func (sm *ManagerImpl) getApiSessionRemovedEventName(token string) events.EventName { eventName := EventRemovedApiSession + "-" + token return events.EventName(eventName) } -func (sm *StateManagerImpl) StartHeartbeat(env env.RouterEnv, intervalSeconds int, closeNotify <-chan struct{}) { +func (sm *ManagerImpl) StartHeartbeat(env env.RouterEnv, intervalSeconds int, closeNotify <-chan struct{}) { sm.heartbeatOperation = newHeartbeatOperation(env, time.Duration(intervalSeconds)*time.Second, sm) var err error @@ -385,7 +553,7 @@ func (sm *StateManagerImpl) StartHeartbeat(env env.RouterEnv, intervalSeconds in pfxlog.Logger().Info("heartbeat starting") } -func (sm *StateManagerImpl) AddConnectedApiSession(token string) { +func (sm *ManagerImpl) AddConnectedApiSession(token string) { sm.activeApiSessions.Upsert(token, nil, func(exist bool, valueInMap *MapWithMutex, newValue *MapWithMutex) *MapWithMutex { if exist { return valueInMap @@ -394,11 +562,11 @@ func (sm *StateManagerImpl) AddConnectedApiSession(token string) { }) } -func (sm *StateManagerImpl) RemoveConnectedApiSession(token string) { +func (sm *ManagerImpl) RemoveConnectedApiSession(token string) { sm.activeApiSessions.Remove(token) } -func (sm *StateManagerImpl) AddConnectedApiSessionWithChannel(token string, removeCB func(), ch channel.Channel) { +func (sm *ManagerImpl) AddConnectedApiSessionWithChannel(token string, removeCB func(), ch channel.Channel) { var sessions *MapWithMutex for sessions == nil { @@ -414,7 +582,7 @@ func (sm *StateManagerImpl) AddConnectedApiSessionWithChannel(token string, remo } } -func (sm *StateManagerImpl) RemoveConnectedApiSessionWithChannel(token string, ch channel.Channel) { +func (sm *ManagerImpl) RemoveConnectedApiSessionWithChannel(token string, ch channel.Channel) { if sessions, ok := sm.activeApiSessions.Get(token); ok { if !ok { pfxlog.Logger().Panic("could not convert active sessions to map") @@ -434,11 +602,28 @@ func (sm *StateManagerImpl) RemoveConnectedApiSessionWithChannel(token string, c } } -func (sm *StateManagerImpl) ActiveApiSessionTokens() []string { - return sm.activeApiSessions.Keys() +func (sm *ManagerImpl) ActiveApiSessionTokens() []string { + var toClose []func() + var activeKeys []string + for i := range sm.activeApiSessions.IterBuffered() { + func() { + token := i.Key + chMutex := i.Val + + chMutex.Visit(func(ch channel.Channel, closeCb func()) { + if ch.IsClosed() { + toClose = append(toClose, closeCb) + } else { + activeKeys = append(activeKeys, token) + } + }) + }() + } + + return activeKeys } -func (sm *StateManagerImpl) flushRecentlyRemoved() { +func (sm *ManagerImpl) flushRecentlyRemoved() { now := time.Now() var toRemove []string sm.recentlyRemovedSessions.IterCb(func(key string, t time.Time) { @@ -458,7 +643,7 @@ func (sm *StateManagerImpl) flushRecentlyRemoved() { } } -func (sm *StateManagerImpl) DumpApiSessions(c *bufio.ReadWriter) error { +func (sm *ManagerImpl) DumpApiSessions(c *bufio.ReadWriter) error { ch := make(chan string, 15) go func() { @@ -516,7 +701,16 @@ func (self *MapWithMutex) Put(ch channel.Channel, f func()) { self.m[ch] = f } -func (sm *StateManagerImpl) ValidateSessions(ch channel.Channel, chunkSize uint32, minInterval, maxInterval time.Duration) { +func (self *MapWithMutex) Visit(cb func(ch channel.Channel, closeCb func())) { + self.Lock() + defer self.Unlock() + + for ch, closeCb := range self.m { + cb(ch, closeCb) + } +} + +func (sm *ManagerImpl) ValidateSessions(ch channel.Channel, chunkSize uint32, minInterval, maxInterval time.Duration) { sessionTokens := sm.sessions.Keys() for len(sessionTokens) > 0 { @@ -561,30 +755,22 @@ func (sm *StateManagerImpl) ValidateSessions(ch channel.Channel, chunkSize uint3 } -func (sm *StateManagerImpl) keyFunc(token *jwt.Token) (interface{}, error) { - kidVal, kidHeaderFound := token.Header["kid"] - - if !kidHeaderFound { - return nil, fmt.Errorf("token does not have kid header, unable to lookup") - } - - kid := kidVal.(string) - - key, keyFound := sm.signerPublicCerts.Get(kid) - - if !keyFound { - sm.RefreshSigners() - - key, keyFound = sm.signerPublicCerts.Get(kid) +func (sm *ManagerImpl) parsePublicKey(publicKey *edge_ctrl_pb.DataState_PublicKey) (crypto.PublicKey, error) { + switch publicKey.Format { + case edge_ctrl_pb.DataState_PublicKey_X509CertDer: + certs, err := x509.ParseCertificates(publicKey.Data) + if err != nil { + return nil, err + } - if !keyFound { - return nil, fmt.Errorf("key for kid %s not found after refresh", kid) + if len(certs) == 0 { + return nil, errors.New("could not parse certificates, der was empty") } - } - return key, nil -} + return certs[0].PublicKey, nil + case edge_ctrl_pb.DataState_PublicKey_PKIXPublicKey: + return x509.ParsePKIXPublicKey(publicKey.Data) + } -func (sm *StateManagerImpl) RefreshSigners() { - //nothing atm + return nil, fmt.Errorf("unsuported public key format: %s", publicKey.Format.String()) } diff --git a/router/xgress_edge/accept.go b/router/xgress_edge/accept.go index dc10b7f6a..aa4d1962f 100644 --- a/router/xgress_edge/accept.go +++ b/router/xgress_edge/accept.go @@ -23,6 +23,7 @@ import ( "github.com/openziti/channel/v2/latency" "github.com/openziti/sdk-golang/ziti/edge" "github.com/openziti/ziti/common/cert" + "github.com/openziti/ziti/router/state" "math" ) @@ -31,6 +32,7 @@ type Acceptor struct { listener *listener options *channel.Options sessionBindHandler channel.BindHandler + manager state.Manager } func (self *Acceptor) BindChannel(binding channel.Binding) error { @@ -38,6 +40,7 @@ func (self *Acceptor) BindChannel(binding channel.Binding) error { log.WithField("token", binding.GetChannel().Id()).Debug("accepting edge connection") fpg := cert.NewFingerprintGenerator() + proxy := &edgeClientConn{ msgMux: edge.NewCowMapMsgMux(), listener: self.listener, @@ -49,28 +52,38 @@ func (self *Acceptor) BindChannel(binding channel.Binding) error { log.Debug("peer fingerprints ", proxy.fingerprints) binding.AddTypedReceiveHandler(&channel.AsyncFunctionReceiveAdapter{ - Type: edge.ContentTypeConnect, - Handler: proxy.processConnect, + Type: edge.ContentTypeConnect, + Handler: func(m *channel.Message, ch channel.Channel) { + proxy.processConnect(self.listener.factory.stateManager, m, ch) + }, }) binding.AddTypedReceiveHandler(&channel.AsyncFunctionReceiveAdapter{ - Type: edge.ContentTypeBind, - Handler: proxy.processBind, + Type: edge.ContentTypeBind, + Handler: func(m *channel.Message, ch channel.Channel) { + proxy.processBind(self.listener.factory.stateManager, m, ch) + }, }) binding.AddTypedReceiveHandler(&channel.AsyncFunctionReceiveAdapter{ - Type: edge.ContentTypeUnbind, - Handler: proxy.processUnbind, + Type: edge.ContentTypeUnbind, + Handler: func(m *channel.Message, ch channel.Channel) { + proxy.processUnbind(self.listener.factory.stateManager, m, ch) + }, }) binding.AddTypedReceiveHandler(&channel.AsyncFunctionReceiveAdapter{ - Type: edge.ContentTypeUpdateBind, - Handler: proxy.processUpdateBind, + Type: edge.ContentTypeUpdateBind, + Handler: func(m *channel.Message, ch channel.Channel) { + proxy.processUpdateBind(self.listener.factory.stateManager, m, ch) + }, }) binding.AddTypedReceiveHandler(&channel.AsyncFunctionReceiveAdapter{ - Type: edge.ContentTypeHealthEvent, - Handler: proxy.processHealthEvent, + Type: edge.ContentTypeHealthEvent, + Handler: func(m *channel.Message, ch channel.Channel) { + proxy.processHealthEvent(self.listener.factory.stateManager, m, ch) + }, }) binding.AddReceiveHandlerF(edge.ContentTypeStateClosed, proxy.msgMux.HandleReceive) diff --git a/router/xgress_edge/connections.go b/router/xgress_edge/connections.go index 661c86d5f..f825b2e71 100644 --- a/router/xgress_edge/connections.go +++ b/router/xgress_edge/connections.go @@ -21,20 +21,22 @@ import ( "fmt" "github.com/michaelquigley/pfxlog" "github.com/openziti/channel/v2" - "github.com/openziti/ziti/common/cert" - "github.com/openziti/ziti/router/fabric" "github.com/openziti/metrics" "github.com/openziti/sdk-golang/ziti/edge" + "github.com/openziti/ziti/common/cert" + "github.com/openziti/ziti/router/state" ) +const JwtTokenPrefix = "ey" + type sessionConnectionHandler struct { - stateManager fabric.StateManager + stateManager state.Manager options *Options invalidApiSessionToken metrics.Meter invalidApiSessionTokenDuringSync metrics.Meter } -func newSessionConnectHandler(stateManager fabric.StateManager, options *Options, metricsRegistry metrics.Registry) *sessionConnectionHandler { +func newSessionConnectHandler(stateManager state.Manager, options *Options, metricsRegistry metrics.Registry) *sessionConnectionHandler { return &sessionConnectionHandler{ stateManager: stateManager, options: options, @@ -47,57 +49,68 @@ func (handler *sessionConnectionHandler) BindChannel(binding channel.Binding) er ch := binding.GetChannel() binding.AddCloseHandler(handler) - if byteToken, ok := ch.Underlay().Headers()[edge.SessionTokenHeader]; ok { - token := string(byteToken) + byteToken, ok := ch.Underlay().Headers()[edge.SessionTokenHeader] - certificates := ch.Certificates() + if !ok { + _ = ch.Close() + return errors.New("no token attribute provided") + } - if len(certificates) == 0 { - return errors.New("no client certificates provided") - } + certificates := ch.Certificates() + + if len(certificates) == 0 { + return errors.New("no client certificates provided") + } - fpg := cert.NewFingerprintGenerator() - fingerprints := fpg.FromCerts(certificates) + fpg := cert.NewFingerprintGenerator() + fingerprints := fpg.FromCerts(certificates) - apiSession := handler.stateManager.GetApiSessionWithTimeout(token, handler.options.lookupApiSessionTimeout) + token := string(byteToken) - if apiSession == nil { - _ = ch.Close() + apiSession := handler.stateManager.GetApiSessionWithTimeout(token, handler.options.lookupApiSessionTimeout) - var subjects []string + if apiSession.Claims != nil { + token = apiSession.Claims.ApiSessionId + } - for _, cert := range certificates { - subjects = append(subjects, cert.Subject.String()) - } + if apiSession == nil { + _ = ch.Close() - handler.invalidApiSessionToken.Mark(1) - if handler.stateManager.IsSyncInProgress() { - handler.invalidApiSessionTokenDuringSync.Mark(1) - } + var subjects []string - return fmt.Errorf("no api session found for token [%s], fingerprints: [%v], subjects [%v]", token, fingerprints, subjects) + for _, curCert := range certificates { + subjects = append(subjects, curCert.Subject.String()) } - for _, fingerprint := range apiSession.CertFingerprints { - if fingerprints.Contains(fingerprint) { - removeListener := handler.stateManager.AddApiSessionRemovedListener(token, func(token string) { - if !ch.IsClosed() { - if err := ch.Close(); err != nil { - pfxlog.Logger().WithError(err).Error("could not close channel during api session removal") - } + handler.invalidApiSessionToken.Mark(1) + if handler.stateManager.IsSyncInProgress() { + handler.invalidApiSessionTokenDuringSync.Mark(1) + } + + return fmt.Errorf("no api session found for token [%s], fingerprints: [%v], subjects [%v]", token, fingerprints, subjects) + } + + for _, fingerprint := range apiSession.CertFingerprints { + if fingerprints.Contains(fingerprint) { + removeListener := handler.stateManager.AddApiSessionRemovedListener(token, func(token string) { + if !ch.IsClosed() { + if err := ch.Close(); err != nil { + pfxlog.Logger().WithError(err).Error("could not close channel during api session removal") } - }) + } + + handler.stateManager.RemoveActiveChannel(ch) + }) - handler.stateManager.AddConnectedApiSessionWithChannel(token, removeListener, ch) + handler.stateManager.AddActiveChannel(ch, apiSession) + handler.stateManager.AddConnectedApiSessionWithChannel(token, removeListener, ch) - return nil - } + return nil } - _ = ch.Close() - return errors.New("invalid client certificate for api session") } + _ = ch.Close() - return errors.New("no token attribute provided") + return errors.New("invalid client certificate for api session") } func (handler *sessionConnectionHandler) HandleClose(ch channel.Channel) { diff --git a/router/xgress_edge/factory.go b/router/xgress_edge/factory.go index e2ff6de04..f84a40d89 100644 --- a/router/xgress_edge/factory.go +++ b/router/xgress_edge/factory.go @@ -27,10 +27,10 @@ import ( "github.com/openziti/ziti/common/pb/edge_ctrl_pb" "github.com/openziti/ziti/router" "github.com/openziti/ziti/router/env" - "github.com/openziti/ziti/router/fabric" "github.com/openziti/ziti/router/handler_edge_ctrl" "github.com/openziti/ziti/router/internal/apiproxy" "github.com/openziti/ziti/router/internal/edgerouter" + "github.com/openziti/ziti/router/state" "github.com/openziti/ziti/router/xgress" "github.com/pkg/errors" "strings" @@ -43,7 +43,7 @@ type Factory struct { routerConfig *router.Config edgeRouterConfig *edgerouter.Config hostedServices *hostedServiceRegistry - stateManager fabric.StateManager + stateManager state.Manager versionProvider versions.VersionProvider certChecker *CertExpirationChecker metricsRegistry metrics.Registry @@ -66,7 +66,6 @@ func (factory *Factory) BindChannel(binding channel.Binding) error { binding.AddTypedReceiveHandler(handler_edge_ctrl.NewApiSessionAddedHandler(factory.stateManager, binding)) binding.AddTypedReceiveHandler(handler_edge_ctrl.NewApiSessionRemovedHandler(factory.stateManager)) binding.AddTypedReceiveHandler(handler_edge_ctrl.NewApiSessionUpdatedHandler(factory.stateManager)) - binding.AddTypedReceiveHandler(handler_edge_ctrl.NewSigningCertAddedHandler(factory.stateManager)) binding.AddTypedReceiveHandler(handler_edge_ctrl.NewExtendEnrollmentCertsHandler(factory.env.GetRouterId(), func() { factory.certChecker.CertsUpdated() })) @@ -75,6 +74,9 @@ func (factory *Factory) BindChannel(binding channel.Binding) error { Handler: factory.hostedServices.HandleCreateTerminatorResponse, }) + binding.AddTypedReceiveHandler(handler_edge_ctrl.NewDataStateHandler(factory.stateManager)) + binding.AddTypedReceiveHandler(handler_edge_ctrl.NewDataStateEventHandler(factory.stateManager)) + return nil } @@ -91,6 +93,9 @@ func (factory *Factory) GetTraceDecoders() []channel.TraceMessageDecoder { func (factory *Factory) Run(env env.RouterEnv) error { factory.stateManager.StartHeartbeat(env, factory.edgeRouterConfig.HeartbeatIntervalSeconds, env.GetCloseNotify()) + + factory.stateManager.StartRouterModelSave(env, factory.edgeRouterConfig.Db, factory.edgeRouterConfig.DbSaveInterval) + factory.certChecker = NewCertExpirationChecker(factory.env.GetRouterId(), factory.edgeRouterConfig, env.GetNetworkControllers(), env.GetCloseNotify()) go func() { @@ -120,13 +125,16 @@ func (factory *Factory) LoadConfig(configMap map[interface{}]interface{}) error config.Tcfg["protocol"] = append(config.Tcfg.Protocols(), "ziti-edge", "") factory.edgeRouterConfig = config + + factory.stateManager.LoadRouterModel(factory.edgeRouterConfig.Db) + go apiproxy.Start(config) return nil } // NewFactory constructs a new Edge Xgress Factory instance -func NewFactory(routerConfig *router.Config, env env.RouterEnv, stateManager fabric.StateManager) *Factory { +func NewFactory(routerConfig *router.Config, env env.RouterEnv, stateManager state.Manager) *Factory { factory := &Factory{ ctrls: env.GetNetworkControllers(), hostedServices: newHostedServicesRegistry(env), diff --git a/router/xgress_edge/listener.go b/router/xgress_edge/listener.go index 630e7d803..9dc5d6323 100644 --- a/router/xgress_edge/listener.go +++ b/router/xgress_edge/listener.go @@ -20,6 +20,7 @@ import ( "encoding/binary" "fmt" "github.com/openziti/ziti/common/ctrl_msg" + "strings" "time" "github.com/openziti/ziti/common/capabilities" @@ -36,6 +37,7 @@ import ( "github.com/openziti/identity" "github.com/openziti/sdk-golang/ziti/edge" "github.com/openziti/transport/v2" + "github.com/openziti/ziti/router/state" "github.com/openziti/ziti/router/xgress" "github.com/openziti/ziti/router/xgress_common" ) @@ -120,9 +122,9 @@ func (self *edgeClientConn) ContentType() int32 { return edge.ContentTypeData } -func (self *edgeClientConn) processConnect(req *channel.Message, ch channel.Channel) { - token := string(req.Body) - log := pfxlog.ContextLogger(ch.Label()).WithField("token", token).WithFields(edge.GetLoggerFields(req)) +func (self *edgeClientConn) processConnect(manager state.Manager, req *channel.Message, ch channel.Channel) { + sessionToken := string(req.Body) + log := pfxlog.ContextLogger(ch.Label()).WithField("token", sessionToken).WithFields(edge.GetLoggerFields(req)) connId, found := req.GetUint32Header(edge.ConnIdHeader) if !found { pfxlog.Logger().Errorf("connId not set. unable to process connect message") @@ -144,13 +146,13 @@ func (self *edgeClientConn) processConnect(req *channel.Message, ch channel.Chan } // need to remove session remove listener on close - conn.onClose = self.listener.factory.stateManager.AddEdgeSessionRemovedListener(token, func(token string) { + conn.onClose = self.listener.factory.stateManager.AddEdgeSessionRemovedListener(sessionToken, func(token string) { conn.close(true, "session closed") }) // We can't fix conn id, since it's provided by the client if err := self.msgMux.AddMsgSink(conn); err != nil { - log.WithError(err).WithField("token", token).Error("error adding to msg mux") + log.WithError(err).WithField("token", sessionToken).Error("error adding to msg mux") self.sendStateClosedReply(err.Error(), req) return } @@ -168,12 +170,23 @@ func (self *edgeClientConn) processConnect(req *channel.Message, ch channel.Chan terminatorIdentity, _ := req.GetStringHeader(edge.TerminatorIdentityHeader) request := &ctrl_msg.CreateCircuitRequest{ - SessionToken: token, + SessionToken: sessionToken, Fingerprints: self.fingerprints.Prints(), TerminatorInstanceId: terminatorIdentity, PeerData: peerData, } + if manager.GetConfig().Ha.Enabled && strings.HasPrefix(sessionToken, JwtTokenPrefix) { + apiSession := manager.GetApiSessionFromCh(ch) + + if apiSession == nil { + pfxlog.Logger().Errorf("could not find api session for channel, unable to process bind message") + return + } + + request.ApiSessionToken = apiSession.Token + } + response, err := self.sendCreateCircuitRequest(request, ctrlCh) if err != nil { log.WithError(err).Warn("failed to dial fabric") @@ -242,7 +255,7 @@ func (self *edgeClientConn) sendCreateCircuitRequestV2(req *ctrl_msg.CreateCircu return ctrl_msg.DecodeCreateCircuitResponse(msg) } -func (self *edgeClientConn) processBind(req *channel.Message, ch channel.Channel) { +func (self *edgeClientConn) processBind(manager state.Manager, req *channel.Message, ch channel.Channel) { ctrlCh := self.listener.factory.ctrls.AnyCtrlChannel() if ctrlCh == nil { errStr := "no controller available, cannot create terminator" @@ -257,17 +270,17 @@ func (self *edgeClientConn) processBind(req *channel.Message, ch channel.Channel supportsCreateTerminatorV2 := capabilities.IsCapable(ctrlCh, capabilities.ControllerCreateTerminatorV2) if supportsCreateTerminatorV2 { - self.processBindV2(req, ch) + self.processBindV2(manager, req, ch, ctrlCh) } else { - self.processBindV1(req, ch, ctrlCh) + self.processBindV1(manager, req, ch, ctrlCh) } } -func (self *edgeClientConn) processBindV1(req *channel.Message, ch channel.Channel, ctrlCh channel.Channel) { - token := string(req.Body) +func (self *edgeClientConn) processBindV1(manager state.Manager, req *channel.Message, ch channel.Channel, ctrlCh channel.Channel) { + sessionToken := string(req.Body) log := pfxlog.ContextLogger(ch.Label()). - WithField("token", token). + WithField("sessionToken", sessionToken). WithFields(edge.GetLoggerFields(req)). WithField("routerId", self.listener.id.Token) @@ -308,17 +321,17 @@ func (self *edgeClientConn) processBindV1(req *channel.Message, ch channel.Chann messageSink := &edgeTerminator{ MsgChannel: *edge.NewEdgeMsgChannel(self.ch, connId), edgeClientConn: self, - token: token, + token: sessionToken, assignIds: assignIds, createTime: time.Now(), } // need to remove session remove listener on close - messageSink.onClose = self.listener.factory.stateManager.AddEdgeSessionRemovedListener(token, func(token string) { + messageSink.onClose = self.listener.factory.stateManager.AddEdgeSessionRemovedListener(sessionToken, func(token string) { messageSink.close(true, true, "session ended") }) - self.listener.factory.hostedServices.Put(token, messageSink) + self.listener.factory.hostedServices.Put(sessionToken, messageSink) terminatorIdentity, _ := req.GetStringHeader(edge.TerminatorIdentityHeader) var terminatorIdentitySecret []byte @@ -327,7 +340,7 @@ func (self *edgeClientConn) processBindV1(req *channel.Message, ch channel.Chann } request := &edge_ctrl_pb.CreateTerminatorRequest{ - SessionToken: token, + SessionToken: sessionToken, Fingerprints: self.fingerprints.Prints(), PeerData: hostData, Cost: uint32(cost), @@ -336,6 +349,17 @@ func (self *edgeClientConn) processBindV1(req *channel.Message, ch channel.Chann InstanceSecret: terminatorIdentitySecret, } + if manager.GetConfig().Ha.Enabled && strings.HasPrefix(sessionToken, JwtTokenPrefix) { + apiSession := manager.GetApiSessionFromCh(ch) + + if apiSession == nil { + pfxlog.Logger().Errorf("could not find api session for channel, unable to process bind message") + return + } + + request.ApiSessionToken = apiSession.Token + } + timeout := self.listener.factory.ctrls.DefaultRequestTimeout() responseMsg, err := protobufs.MarshalTyped(request).WithTimeout(timeout).SendForReply(ctrlCh) if err = xgress_common.CheckForFailureResult(responseMsg, err, edge_ctrl_pb.ContentType_CreateTerminatorResponseType); err != nil { @@ -362,11 +386,11 @@ func (self *edgeClientConn) processBindV1(req *channel.Message, ch channel.Chann log.Info("created terminator") } -func (self *edgeClientConn) processBindV2(req *channel.Message, ch channel.Channel) { - token := string(req.Body) +func (self *edgeClientConn) processBindV2(manager state.Manager, req *channel.Message, ch channel.Channel, ctrlCh channel.Channel) { + sessionToken := string(req.Body) log := pfxlog.ContextLogger(ch.Label()). - WithField("token", token). + WithField("sessionToken", sessionToken). WithFields(edge.GetLoggerFields(req)). WithField("routerId", self.listener.id.Token) @@ -386,7 +410,7 @@ func (self *edgeClientConn) processBindV2(req *channel.Message, ch channel.Chann log = log.WithField("terminatorId", terminatorId) // everything is the same, we can reuse the terminator - if terminator.edgeClientConn == self && terminator.token == token { + if terminator.edgeClientConn == self && terminator.token == sessionToken { log.Info("duplicate create terminator request") self.sendStateConnectedReply(req, nil) return @@ -443,7 +467,7 @@ func (self *edgeClientConn) processBindV2(req *channel.Message, ch channel.Chann terminator := &edgeTerminator{ MsgChannel: *edge.NewEdgeMsgChannel(self.ch, connId), edgeClientConn: self, - token: token, + token: sessionToken, cost: cost, precedence: precedence, instance: terminatorInstance, @@ -475,14 +499,14 @@ func (self *edgeClientConn) processBindV2(req *channel.Message, ch channel.Chann terminator.terminatorId.Store(terminatorId) terminator.state.Store(TerminatorStatePendingEstablishment) - if self.listener.factory.stateManager.WasSessionRecentlyRemoved(token) { + if self.listener.factory.stateManager.WasSessionRecentlyRemoved(sessionToken) { log.Info("invalid session, not establishing terminator") terminator.establishCallback(false, "invalid session") return } // need to remove session remove listener on close - terminator.onClose = self.listener.factory.stateManager.AddEdgeSessionRemovedListener(token, func(token string) { + terminator.onClose = self.listener.factory.stateManager.AddEdgeSessionRemovedListener(sessionToken, func(token string) { terminator.close(true, true, "session ended") }) @@ -496,7 +520,7 @@ func (self *edgeClientConn) processBindV2(req *channel.Message, ch channel.Chann } -func (self *edgeClientConn) processUnbind(req *channel.Message, _ channel.Channel) { +func (self *edgeClientConn) processUnbind(manager state.Manager, req *channel.Message, _ channel.Channel) { connId, _ := req.GetUint32Header(edge.ConnIdHeader) token := string(req.Body) atLeastOneTerminatorRemoved := self.listener.factory.hostedServices.unbindSession(connId, token, self) @@ -521,11 +545,11 @@ func (self *edgeClientConn) removeTerminator(ctrlCh channel.Channel, token, term return xgress_common.CheckForFailureResult(responseMsg, err, edge_ctrl_pb.ContentType_RemoveTerminatorResponseType) } -func (self *edgeClientConn) processUpdateBind(req *channel.Message, ch channel.Channel) { - token := string(req.Body) +func (self *edgeClientConn) processUpdateBind(manager state.Manager, req *channel.Message, ch channel.Channel) { + sessionToken := string(req.Body) - log := pfxlog.ContextLogger(ch.Label()).WithField("token", token).WithFields(edge.GetLoggerFields(req)) - terminators := self.listener.factory.hostedServices.getRelatedTerminators(token, self) + log := pfxlog.ContextLogger(ch.Label()).WithField("sessionToken", sessionToken).WithFields(edge.GetLoggerFields(req)) + terminators := self.listener.factory.hostedServices.getRelatedTerminators(sessionToken, self) if len(terminators) == 0 { log.Error("failed to update bind, no listener found") @@ -540,11 +564,16 @@ func (self *edgeClientConn) processUpdateBind(req *channel.Message, ch channel.C for _, terminator := range terminators { request := &edge_ctrl_pb.UpdateTerminatorRequest{ - SessionToken: token, + SessionToken: sessionToken, Fingerprints: self.fingerprints.Prints(), TerminatorId: terminator.terminatorId.Load(), } + if manager.GetConfig().Ha.Enabled && strings.HasPrefix(sessionToken, JwtTokenPrefix) { + apiSession := manager.GetApiSessionFromCh(ch) + request.ApiSessionToken = apiSession.Token + } + if costVal, hasCost := req.GetUint16Header(edge.CostHeader); hasCost { request.UpdateCost = true request.Cost = uint32(costVal) @@ -579,9 +608,9 @@ func (self *edgeClientConn) processUpdateBind(req *channel.Message, ch channel.C } } -func (self *edgeClientConn) processHealthEvent(req *channel.Message, ch channel.Channel) { - token := string(req.Body) - log := pfxlog.ContextLogger(ch.Label()).WithField("sessionId", token).WithFields(edge.GetLoggerFields(req)) +func (self *edgeClientConn) processHealthEvent(manager state.Manager, req *channel.Message, ch channel.Channel) { + sessionToken := string(req.Body) + log := pfxlog.ContextLogger(ch.Label()).WithField("sessionId", sessionToken).WithFields(edge.GetLoggerFields(req)) ctrlCh := self.listener.factory.ctrls.AnyCtrlChannel() if ctrlCh == nil { @@ -589,7 +618,7 @@ func (self *edgeClientConn) processHealthEvent(req *channel.Message, ch channel. return } - terminator, ok := self.listener.factory.hostedServices.Get(token) + terminator, ok := self.listener.factory.hostedServices.Get(sessionToken) if !ok { log.Error("failed to update bind, no listener found") @@ -599,12 +628,17 @@ func (self *edgeClientConn) processHealthEvent(req *channel.Message, ch channel. checkPassed, _ := req.GetBoolHeader(edge.HealthStatusHeader) request := &edge_ctrl_pb.HealthEventRequest{ - SessionToken: token, + SessionToken: sessionToken, Fingerprints: self.fingerprints.Prints(), TerminatorId: terminator.terminatorId.Load(), CheckPassed: checkPassed, } + if manager.GetConfig().Ha.Enabled && strings.HasPrefix(sessionToken, JwtTokenPrefix) { + apiSession := manager.GetApiSessionFromCh(ch) + request.ApiSessionToken = apiSession.Token + } + log = log.WithField("terminator", terminator.terminatorId.Load()).WithField("checkPassed", checkPassed) log.Debug("sending health event") diff --git a/router/xgress_edge_tunnel/factory.go b/router/xgress_edge_tunnel/factory.go index 6cfb435d8..6b4863c2b 100644 --- a/router/xgress_edge_tunnel/factory.go +++ b/router/xgress_edge_tunnel/factory.go @@ -26,8 +26,8 @@ import ( "github.com/openziti/ziti/common/pb/edge_ctrl_pb" "github.com/openziti/ziti/router" "github.com/openziti/ziti/router/env" - "github.com/openziti/ziti/router/fabric" "github.com/openziti/ziti/router/handler_edge_ctrl" + "github.com/openziti/ziti/router/state" "github.com/openziti/ziti/router/xgress" "github.com/pkg/errors" "strings" @@ -45,7 +45,7 @@ type Factory struct { id *identity.TokenId ctrls env.NetworkControllers routerConfig *router.Config - stateManager fabric.StateManager + stateManager state.Manager serviceListHandler *handler_edge_ctrl.ServiceListHandler tunneler *tunneler metricsRegistry metrics.UsageRegistry @@ -89,7 +89,7 @@ func (self *Factory) DefaultRequestTimeout() time.Duration { } // NewFactory constructs a new Edge Xgress Tunnel Factory instance -func NewFactory(env env.RouterEnv, routerConfig *router.Config, stateManager fabric.StateManager) *Factory { +func NewFactory(env env.RouterEnv, routerConfig *router.Config, stateManager state.Manager) *Factory { factory := &Factory{ id: env.GetRouterId(), routerConfig: routerConfig, diff --git a/router/xgress_edge_tunnel/tunneler.go b/router/xgress_edge_tunnel/tunneler.go index 879e26da1..3b41d8cf4 100644 --- a/router/xgress_edge_tunnel/tunneler.go +++ b/router/xgress_edge_tunnel/tunneler.go @@ -18,8 +18,8 @@ package xgress_edge_tunnel import ( "github.com/michaelquigley/pfxlog" - "github.com/openziti/ziti/router/fabric" "github.com/openziti/ziti/router/xgress" + "github.com/openziti/ziti/router/state" "github.com/openziti/ziti/tunnel/dns" "github.com/openziti/ziti/tunnel/intercept" "github.com/openziti/ziti/tunnel/intercept/host" @@ -36,7 +36,7 @@ import ( type tunneler struct { dialOptions *Options listenOptions *Options - stateManager fabric.StateManager + stateManager state.Manager bindHandler xgress.BindHandler interceptor intercept.Interceptor @@ -46,7 +46,7 @@ type tunneler struct { notifyReconnect chan struct{} } -func newTunneler(factory *Factory, stateManager fabric.StateManager) *tunneler { +func newTunneler(factory *Factory, stateManager state.Manager) *tunneler { result := &tunneler{ stateManager: stateManager, terminators: cmap.New[*tunnelTerminator](), diff --git a/tests/ats-ctrl.yml b/tests/ats-ctrl.yml index 64303f5d7..e5fcca7b3 100644 --- a/tests/ats-ctrl.yml +++ b/tests/ats-ctrl.yml @@ -55,3 +55,9 @@ web: - binding: fabric - binding: edge-management - binding: edge-client + - binding: edge-oidc + options: + secret: "12312412421129102" + redirectURIs: + - "http://localhost:*/auth/callback" + - "http://127.0.0.1:*/auth/callback" diff --git a/tests/ats-edge.router.yml.json.gzip b/tests/ats-edge.router.yml.json.gzip new file mode 100644 index 0000000000000000000000000000000000000000..7438f4cb6ebebfd2afaa4e3ddb2fb686373bfcd3 GIT binary patch literal 4119 zcmV+y5a{n8iwFP!00000|J<2JkK|Z(h5t)#SwPU624?Z-$)GnuBMch!-UJzRF{uA8 zROWQ|RBI#+1ZW}Uj_1CIdr9Et`EcTIAH$Rv{l_nV`w;eGd~r!u7aza;?fbWnCNIWU z^Jrf^i-@koS zAV;QPnZWP2|4@Fv%wRb`MdO5heEwc5A zv~RL|aeYorlPL+q1q{<9P9bQ45HyL?Sb}F6kq{(CmuW&HIPv3bp1hKeUp{n2k=T~w z07O>cP*_kYoB+VV+mU*oVx`_Q1K5Jb+Tf_-?Bw1+Wh>*sg2)5?!_%GY5bcP6*tWt0 z!b~w0PB@m2LUm82ev3T8)mb0`#247(P;IoXv*Fxx+39shKZLKlcOJ}U96C~pJ+@d@ z3Ek}u_4ur5Jjec2Qv{>WMrV$PzKuesR|FBsrFzeX9xgl~)!FW|A2<%z8y>JTFi1K$ zSK+d5iZZYw7_83XA@2#e&ikjy3#j2`myS#!?};r*^1RkZ$3-rLhz;d2hII_^Ks z;R&)<3v59Iz~n$hgCBLSx^tisz?ve0RqOsy zxJ)p&9;FfZ3CtmWZk0-wwY!L=<{yTCAr$(AfV;=u>>=;FVrB6x4Hk=eA)3kwa7c|RUtEU)xZCy%fSj{tzO z?IEX!ZbL(6?7&7=fmNcTY-E&M*m=_qmu)AHJ2pM9yPZ~Q}!uYT!e zWd=7zgV=F*A)Rt9l=g#yS-WMwtt8-P^|e_lB19!oCf!zz{iGtJx!tlg&2YwU zN7Q`1UW-GinU~1E;3LZIWv8|TUPhraJx>tOoJiWcZD~KCYuTVjT z$l*5jh8uRbohVZpQf)1d%lVuDj8M5;W3P@+HpVJq%vY=Jn{Oy6I@FCFi?V3BbBl z4Lz!J~*jn_(YQoP{*NKA1q5V0xqn#GwyixfaE3=#sTY%vy+X zOD?k%wFDtJ&Ff+jhed;Kx&(O|@kOVB!yjI(+P>m%=e;|r*fQ?kdT9247Hh*X^(h*ea>p{2XNdo_b*MDGjtbOxk8dB{C$Rj>Eb;AQTa)Ssqx>8E4f*T$Zyz~9B6*ROB$lHnlapi$ zQ+Yw6RGy}J!4wRJqBMj48AHS$7;^g^LsVcs@#lDt*0E3j*?Q@U6zcYRa9=ho35WXd z-$JOf{+G3a!}JE`%B8BZQSnOAb4~~06k1?^S!kwnzA;6ix~7-|$Nx)~Exkefn`H}s zvTT1~_MBsR+XIDoz^BOrME9!GXnok=^F%!0_m`&suKoXdZ;k_v@@L#+SsUIJ&Qa-xL3`}fBH{hmu zHGOnDV4tTg&c_sY5UYtLG?1AIMK#$2d#X^4>t6C`mU%^m*99<~&n_S9AaPH&j4I>0 z9zmYPNpmAj1WVXyahT*N50#h7XPMl#CrzIQQTexPY|Pmh`FLacl*iYz)_qMITVD@m z@M53G#fNU33+yAKR${?4+zMV)sBcTlYESBD;GtR!C}9TsqAkqUAcSuySLvsHjpSJI z-~*=(JPx3ts1?vSYLGC3VRKe0!w^Y&ch9VLA7@kJ-Q9Vr+eImQk%sTB5X~IEQCusB)al$jOxq30WEAEP>|!* zqF~z5IU!RW^=bnnDM*#Tbc2+CInl$I*&DW4QOrNn zhgWLrs2Gr+-zhj~{SLL$VlFP-Vv*%Grz;}#5(@{Llu_K4uHm#JWp(q5((o9++m~qv zP@?340VMYsHJ=pm2x@1sA-doWI~{Qg#=;ttP5_cXo>;#iIhn^81g&!#a&QjA}gjJ{+%~Qdi z2tFsVbUh`o(7UogXP59qjg*gj&xmq|{XShRh0$D8 z4e1xu(8XNdN*P@`#_$CS*o2nStNO0x=>5|0tYU68p^Ri!Hn>v5V;e{Jt=XYiy6}Bt z@wVhMWZc>7z2j5e8J?%{hFjp1Qr6bP-G}ONc&8$1K3^f9 z#doNoT@f9&7nj^5QYIdJT531y)>_D(im75!sSz-^+;Y;yP|4=~7YtPrDPNfp~Ts<4xV%g<$WBk4qI!2rAKhWe~=8J!VCMllhbe7OK zfieVvWjTSBNlDTq!@zV-ph%X|XkPw|Cc^f^hMwGipOE}tP6~cbL@=Ef5MBH!5&2C! za$eAM@RhQ#waz^r`YFD_nZZU{i>}xhs<*>b(J%SO*ZtcZo>!nl@jqhaN1l}S6xxq|1|Ni zKNAo3Gx4wmu*OA9>_K?AdO10($+oBCEz{x4ZLAkMKUp9bXYVu~Q|wM}JNE$pY=er# zb>q1>QRImaBYit=4m235qKR5cyU#!)2MxYf(W)9UZ{j&_z`;|-TAuOFZNN@9hBff6 zWJF1THaO!B`p;c((Wyd;M{wb$Q%jlIt#Vk+?WhqiUm=N9}6_x7o6If z_nBidm)>sO9r$AtxA-VWZ|t?L0O(--yFGnclZf-6`l<_px* z%RyeMY|9I;Ru3SPQN$-(;Ub>b_=f58gRHSzhy%&060)Y(^RcpUnM6;WMlU`zZ-<>9 zgg9h7Ylw4J-wB68HOg?Ewa%Znhp$268szpt(3>`{q|KN5P++AG2aZkbpmT)*CMfn^ zu;Jb~9&;Mm80lXBj1yZxXCZ%E5`8uqs~WrZAl?=(n+=KGniuNrh>k|#BU>6aRJ#*K zF;2e6_-jCm@%fm_Si9Q&{nWg|*whSeAMc}O=NYf1TW)0d%yd0c+Gdth1}T(mRoNF- z(u|4*M2Lfst+@8gwzS3O3Vou_2T5Z&PMkb`M`TrW`f5Hal#Fi$%t#u3`MK*+RMGE{ zdru<6HMi?+ZjdsuJ1xn=DC71s4d@#|z7m^BeOEf5g}(Nk+76OQt)@cE5oAmq<5`AZ z=3{&Zl*Z6zaZid{=n#r<>`1pSJEgd5bZ=c#kzSdt#pvyv`N3RBbR0|qyY~GDVn>{f1vE%ug`gE$hvgg&ktrO41isgPx?RLz9BP>>p^PhzV zo0Ru{lfC4T%giHnWik$yF^}Py5ETT*XSx$`w*(g`EeUa|-BGEmHfLA6+&5{7@_`}BjRWJGn8$-UqfBpXb+s9JuQl;QP0aX3UH8 V;}`V%zXt#S|Nr7+zPscY001T~C 0") } // run implements the command diff --git a/ziti/cmd/create/create_config_controller_test.go b/ziti/cmd/create/create_config_controller_test.go index 925b18dc3..5665505b3 100644 --- a/ziti/cmd/create/create_config_controller_test.go +++ b/ziti/cmd/create/create_config_controller_test.go @@ -119,8 +119,7 @@ func TestControllerOutputPathDoesNotExist(t *testing.T) { err := options.run(&ConfigTemplateValues{}) - //check wrapped error type and not internal strings as they vary between operating systems - assert.Error(t, err) + //check for system errors instead of error msgs as paths and error msg formatting differs between os assert.Equal(t, errors.Unwrap(err), syscall.ENOENT) } diff --git a/ziti/cmd/edge/quickstart.go b/ziti/cmd/edge/quickstart.go index d861a4462..4fcd509e6 100644 --- a/ziti/cmd/edge/quickstart.go +++ b/ziti/cmd/edge/quickstart.go @@ -194,7 +194,7 @@ func (o *QuickstartOpts) run(ctx context.Context) { //completed normally logrus.Info("Controller online. Continuing...") case <-time.After(timeout): - fmt.Println("timed out waiting for controller") + fmt.Println("timed out waiting for controller:", ctrlUrl) o.cleanupHome() return } diff --git a/ziti/router/run.go b/ziti/router/run.go index 4edbc1b87..0e8107157 100644 --- a/ziti/router/run.go +++ b/ziti/router/run.go @@ -25,7 +25,7 @@ import ( "github.com/openziti/ziti/common/version" "github.com/openziti/ziti/router" "github.com/openziti/ziti/router/debugops" - "github.com/openziti/ziti/router/fabric" + "github.com/openziti/ziti/router/state" "github.com/openziti/ziti/router/xgress" "github.com/openziti/ziti/router/xgress_edge" "github.com/openziti/ziti/router/xgress_edge_transport" @@ -73,7 +73,7 @@ func run(cmd *cobra.Command, args []string) { r := router.Create(config, version.GetCmdBuildInfo()) - stateManager := fabric.NewStateManager() + stateManager := state.NewManager(config) xgressEdgeFactory := xgress_edge.NewFactory(config, r, stateManager) xgress.GlobalRegistry().Register(common.EdgeBinding, xgressEdgeFactory) From 401de61bbc379c782456b371d76f59a1417a830a Mon Sep 17 00:00:00 2001 From: Andrew Martinez Date: Thu, 29 Feb 2024 10:06:22 -0500 Subject: [PATCH 02/29] spelling errors --- controller/env/broker.go | 2 ++ controller/sync_strats/sync_instant.go | 6 +++--- router/internal/edgerouter/config.go | 2 +- router/state/manager.go | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/controller/env/broker.go b/controller/env/broker.go index dde6e03b1..e92479562 100644 --- a/controller/env/broker.go +++ b/controller/env/broker.go @@ -79,6 +79,8 @@ func NewBroker(ae *AppEnv, synchronizer RouterSyncStrategy) *Broker { ae.HostController.GetNetwork().AddRouterPresenceHandler(broker) ae.HostController.GetEventDispatcher().AddClusterEventHandler(broker) + ae.GetHostController().GetPeerSigners() + return broker } diff --git a/controller/sync_strats/sync_instant.go b/controller/sync_strats/sync_instant.go index e06a2b80b..71cced185 100644 --- a/controller/sync_strats/sync_instant.go +++ b/controller/sync_strats/sync_instant.go @@ -1457,7 +1457,7 @@ func (h *constraintToIndexedEvents[E]) ProcessPostCommit(state *boltz.EntityChan index, err := h.indexProvider.NextIndex(state.Ctx) if err != nil { - pfxlog.Logger().WithError(err).Errorf("could not process post commit create for %T, could not aquire index", state.FinalState) + pfxlog.Logger().WithError(err).Errorf("could not process post commit create for %T, could not acquire index", state.FinalState) return } @@ -1468,7 +1468,7 @@ func (h *constraintToIndexedEvents[E]) ProcessPostCommit(state *boltz.EntityChan index, err := h.indexProvider.NextIndex(state.Ctx) if err != nil { - pfxlog.Logger().WithError(err).Errorf("could not process post commit update for %T, could not aquire index", state.FinalState) + pfxlog.Logger().WithError(err).Errorf("could not process post commit update for %T, could not acquire index", state.FinalState) return } @@ -1479,7 +1479,7 @@ func (h *constraintToIndexedEvents[E]) ProcessPostCommit(state *boltz.EntityChan index, err := h.indexProvider.NextIndex(state.Ctx) if err != nil { - pfxlog.Logger().WithError(err).Errorf("could not process post commit delete for %T, could not aquire index", state.FinalState) + pfxlog.Logger().WithError(err).Errorf("could not process post commit delete for %T, could not acquire index", state.FinalState) return } diff --git a/router/internal/edgerouter/config.go b/router/internal/edgerouter/config.go index ccea8b185..a18ec1ae4 100644 --- a/router/internal/edgerouter/config.go +++ b/router/internal/edgerouter/config.go @@ -151,7 +151,7 @@ func (config *Config) LoadConfigFromMap(configMap map[interface{}]interface{}) e pfxlog.Logger().Warn("the db property was not set, using default for cached data model: %s", config.Db) } - pfxlog.Logger().Infof("cached data modile file set to: %s", config.Db) + pfxlog.Logger().Infof("cached data model file set to: %s", config.Db) } if val, found := edgeConfigMap["dbSaveIntervalSeconds"]; found { diff --git a/router/state/manager.go b/router/state/manager.go index fa0463a2c..39ae0d984 100644 --- a/router/state/manager.go +++ b/router/state/manager.go @@ -772,5 +772,5 @@ func (sm *ManagerImpl) parsePublicKey(publicKey *edge_ctrl_pb.DataState_PublicKe return x509.ParsePKIXPublicKey(publicKey.Data) } - return nil, fmt.Errorf("unsuported public key format: %s", publicKey.Format.String()) + return nil, fmt.Errorf("unsupported public key format: %s", publicKey.Format.String()) } From bfee741b20b4433631067ec56aa701657ab15fec Mon Sep 17 00:00:00 2001 From: Andrew Martinez Date: Thu, 29 Feb 2024 10:08:37 -0500 Subject: [PATCH 03/29] more codespell errors --- controller/server/oidc-api.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controller/server/oidc-api.go b/controller/server/oidc-api.go index 5c4970943..af4ea91f5 100644 --- a/controller/server/oidc-api.go +++ b/controller/server/oidc-api.go @@ -125,7 +125,7 @@ func NewOidcApiHandler(serverConfig *xweb.ServerConfig, ae *env.AppEnv, options bytes := make([]byte, 32) _, err := rand.Read(bytes) if err != nil { - return nil, fmt.Errorf("could not genreate random secret: %w", err) + return nil, fmt.Errorf("could not generate random secret: %w", err) } oidcConfig.TokenSecret = hex.EncodeToString(bytes) From a3c3da870f7339b7cd8e16243b3197d9d922e6a8 Mon Sep 17 00:00:00 2001 From: Andrew Martinez Date: Tue, 5 Mar 2024 09:48:13 -0500 Subject: [PATCH 04/29] pr changes, fixes revocation events --- controller/env/appenv.go | 5 ++--- controller/sync_strats/sync_instant.go | 4 ++-- tests/ats-edge.router.yml.json.gzip | Bin 4119 -> 0 bytes 3 files changed, 4 insertions(+), 5 deletions(-) delete mode 100644 tests/ats-edge.router.yml.json.gzip diff --git a/controller/env/appenv.go b/controller/env/appenv.go index 5a3947f63..f56bf45a1 100644 --- a/controller/env/appenv.go +++ b/controller/env/appenv.go @@ -82,9 +82,8 @@ const ( ) type AppEnv struct { - BoltStores *db.Stores - Managers *model.Managers - Config *config.Config + Managers *model.Managers + Config *config.Config Versions *ziti.Versions diff --git a/controller/sync_strats/sync_instant.go b/controller/sync_strats/sync_instant.go index 71cced185..ca27cef83 100644 --- a/controller/sync_strats/sync_instant.go +++ b/controller/sync_strats/sync_instant.go @@ -193,14 +193,14 @@ func (strategy *InstantStrategy) Initialize(logSize uint64, bufferSize uint) err } strategy.ae.GetStores().Ca.AddEntityConstraint(strategy.caHandler) - //ca create/delete/update + //revocation create/delete/update strategy.revocationHandler = &constraintToIndexedEvents[*db.Revocation]{ indexProvider: strategy.indexProvider, createHandler: strategy.RevocationCreate, updateHandler: strategy.RevocationUpdate, deleteHandler: strategy.RevocationDelete, } - strategy.ae.GetStores().Ca.AddEntityConstraint(strategy.caHandler) + strategy.ae.GetStores().Revocation.AddEntityConstraint(strategy.revocationHandler) return nil } diff --git a/tests/ats-edge.router.yml.json.gzip b/tests/ats-edge.router.yml.json.gzip deleted file mode 100644 index 7438f4cb6ebebfd2afaa4e3ddb2fb686373bfcd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4119 zcmV+y5a{n8iwFP!00000|J<2JkK|Z(h5t)#SwPU624?Z-$)GnuBMch!-UJzRF{uA8 zROWQ|RBI#+1ZW}Uj_1CIdr9Et`EcTIAH$Rv{l_nV`w;eGd~r!u7aza;?fbWnCNIWU z^Jrf^i-@koS zAV;QPnZWP2|4@Fv%wRb`MdO5heEwc5A zv~RL|aeYorlPL+q1q{<9P9bQ45HyL?Sb}F6kq{(CmuW&HIPv3bp1hKeUp{n2k=T~w z07O>cP*_kYoB+VV+mU*oVx`_Q1K5Jb+Tf_-?Bw1+Wh>*sg2)5?!_%GY5bcP6*tWt0 z!b~w0PB@m2LUm82ev3T8)mb0`#247(P;IoXv*Fxx+39shKZLKlcOJ}U96C~pJ+@d@ z3Ek}u_4ur5Jjec2Qv{>WMrV$PzKuesR|FBsrFzeX9xgl~)!FW|A2<%z8y>JTFi1K$ zSK+d5iZZYw7_83XA@2#e&ikjy3#j2`myS#!?};r*^1RkZ$3-rLhz;d2hII_^Ks z;R&)<3v59Iz~n$hgCBLSx^tisz?ve0RqOsy zxJ)p&9;FfZ3CtmWZk0-wwY!L=<{yTCAr$(AfV;=u>>=;FVrB6x4Hk=eA)3kwa7c|RUtEU)xZCy%fSj{tzO z?IEX!ZbL(6?7&7=fmNcTY-E&M*m=_qmu)AHJ2pM9yPZ~Q}!uYT!e zWd=7zgV=F*A)Rt9l=g#yS-WMwtt8-P^|e_lB19!oCf!zz{iGtJx!tlg&2YwU zN7Q`1UW-GinU~1E;3LZIWv8|TUPhraJx>tOoJiWcZD~KCYuTVjT z$l*5jh8uRbohVZpQf)1d%lVuDj8M5;W3P@+HpVJq%vY=Jn{Oy6I@FCFi?V3BbBl z4Lz!J~*jn_(YQoP{*NKA1q5V0xqn#GwyixfaE3=#sTY%vy+X zOD?k%wFDtJ&Ff+jhed;Kx&(O|@kOVB!yjI(+P>m%=e;|r*fQ?kdT9247Hh*X^(h*ea>p{2XNdo_b*MDGjtbOxk8dB{C$Rj>Eb;AQTa)Ssqx>8E4f*T$Zyz~9B6*ROB$lHnlapi$ zQ+Yw6RGy}J!4wRJqBMj48AHS$7;^g^LsVcs@#lDt*0E3j*?Q@U6zcYRa9=ho35WXd z-$JOf{+G3a!}JE`%B8BZQSnOAb4~~06k1?^S!kwnzA;6ix~7-|$Nx)~Exkefn`H}s zvTT1~_MBsR+XIDoz^BOrME9!GXnok=^F%!0_m`&suKoXdZ;k_v@@L#+SsUIJ&Qa-xL3`}fBH{hmu zHGOnDV4tTg&c_sY5UYtLG?1AIMK#$2d#X^4>t6C`mU%^m*99<~&n_S9AaPH&j4I>0 z9zmYPNpmAj1WVXyahT*N50#h7XPMl#CrzIQQTexPY|Pmh`FLacl*iYz)_qMITVD@m z@M53G#fNU33+yAKR${?4+zMV)sBcTlYESBD;GtR!C}9TsqAkqUAcSuySLvsHjpSJI z-~*=(JPx3ts1?vSYLGC3VRKe0!w^Y&ch9VLA7@kJ-Q9Vr+eImQk%sTB5X~IEQCusB)al$jOxq30WEAEP>|!* zqF~z5IU!RW^=bnnDM*#Tbc2+CInl$I*&DW4QOrNn zhgWLrs2Gr+-zhj~{SLL$VlFP-Vv*%Grz;}#5(@{Llu_K4uHm#JWp(q5((o9++m~qv zP@?340VMYsHJ=pm2x@1sA-doWI~{Qg#=;ttP5_cXo>;#iIhn^81g&!#a&QjA}gjJ{+%~Qdi z2tFsVbUh`o(7UogXP59qjg*gj&xmq|{XShRh0$D8 z4e1xu(8XNdN*P@`#_$CS*o2nStNO0x=>5|0tYU68p^Ri!Hn>v5V;e{Jt=XYiy6}Bt z@wVhMWZc>7z2j5e8J?%{hFjp1Qr6bP-G}ONc&8$1K3^f9 z#doNoT@f9&7nj^5QYIdJT531y)>_D(im75!sSz-^+;Y;yP|4=~7YtPrDPNfp~Ts<4xV%g<$WBk4qI!2rAKhWe~=8J!VCMllhbe7OK zfieVvWjTSBNlDTq!@zV-ph%X|XkPw|Cc^f^hMwGipOE}tP6~cbL@=Ef5MBH!5&2C! za$eAM@RhQ#waz^r`YFD_nZZU{i>}xhs<*>b(J%SO*ZtcZo>!nl@jqhaN1l}S6xxq|1|Ni zKNAo3Gx4wmu*OA9>_K?AdO10($+oBCEz{x4ZLAkMKUp9bXYVu~Q|wM}JNE$pY=er# zb>q1>QRImaBYit=4m235qKR5cyU#!)2MxYf(W)9UZ{j&_z`;|-TAuOFZNN@9hBff6 zWJF1THaO!B`p;c((Wyd;M{wb$Q%jlIt#Vk+?WhqiUm=N9}6_x7o6If z_nBidm)>sO9r$AtxA-VWZ|t?L0O(--yFGnclZf-6`l<_px* z%RyeMY|9I;Ru3SPQN$-(;Ub>b_=f58gRHSzhy%&060)Y(^RcpUnM6;WMlU`zZ-<>9 zgg9h7Ylw4J-wB68HOg?Ewa%Znhp$268szpt(3>`{q|KN5P++AG2aZkbpmT)*CMfn^ zu;Jb~9&;Mm80lXBj1yZxXCZ%E5`8uqs~WrZAl?=(n+=KGniuNrh>k|#BU>6aRJ#*K zF;2e6_-jCm@%fm_Si9Q&{nWg|*whSeAMc}O=NYf1TW)0d%yd0c+Gdth1}T(mRoNF- z(u|4*M2Lfst+@8gwzS3O3Vou_2T5Z&PMkb`M`TrW`f5Hal#Fi$%t#u3`MK*+RMGE{ zdru<6HMi?+ZjdsuJ1xn=DC71s4d@#|z7m^BeOEf5g}(Nk+76OQt)@cE5oAmq<5`AZ z=3{&Zl*Z6zaZid{=n#r<>`1pSJEgd5bZ=c#kzSdt#pvyv`N3RBbR0|qyY~GDVn>{f1vE%ug`gE$hvgg&ktrO41isgPx?RLz9BP>>p^PhzV zo0Ru{lfC4T%giHnWik$yF^}Py5ETT*XSx$`w*(g`EeUa|-BGEmHfLA6+&5{7@_`}BjRWJGn8$-UqfBpXb+s9JuQl;QP0aX3UH8 V;}`V%zXt#S|Nr7+zPscY001T~C Date: Tue, 5 Mar 2024 10:25:24 -0500 Subject: [PATCH 05/29] lint fixes --- controller/jwtsigner/jwt.go | 1 - controller/oidc_auth/negotiate.go | 8 +--- controller/oidc_auth/parse.go | 4 +- controller/oidc_auth/render.go | 13 +++--- go.mod | 64 +++++++++++++-------------- go.sum | 65 ++++++++++++++++++++++++++++ router/internal/edgerouter/config.go | 2 +- router/xgress_edge/accept.go | 2 - tests/.gitignore | 1 + zititest/go.mod | 64 +++++++++++++-------------- zititest/go.sum | 33 ++++++++++++++ 11 files changed, 173 insertions(+), 84 deletions(-) create mode 100644 tests/.gitignore diff --git a/controller/jwtsigner/jwt.go b/controller/jwtsigner/jwt.go index 96c56f6a9..bcafb2fe8 100644 --- a/controller/jwtsigner/jwt.go +++ b/controller/jwtsigner/jwt.go @@ -29,7 +29,6 @@ type Signer interface { type SignerImpl struct { signingMethod jwt.SigningMethod - issuer string key crypto.PrivateKey keyId string } diff --git a/controller/oidc_auth/negotiate.go b/controller/oidc_auth/negotiate.go index 87a81ba42..9294599f3 100644 --- a/controller/oidc_auth/negotiate.go +++ b/controller/oidc_auth/negotiate.go @@ -26,13 +26,7 @@ func negotiateResponseContentType(r *http.Request) (string, *errorz.ApiError) { } } - return "", &errorz.ApiError{ - Code: "NOT_ACCEPTABLE", - Message: fmt.Sprintf("unable to satisfy accept header provided: %s. Supported headers include %s and %s", acceptHeader, JsonContentType, HtmlContentType), - Status: http.StatusNotAcceptable, - Cause: nil, - AppendCause: false, - } + return "", newNotAcceptableError(acceptHeader) } func negotiateBodyContentType(r *http.Request) (string, *errorz.ApiError) { diff --git a/controller/oidc_auth/parse.go b/controller/oidc_auth/parse.go index e31c246fc..dbba45b2b 100644 --- a/controller/oidc_auth/parse.go +++ b/controller/oidc_auth/parse.go @@ -40,11 +40,11 @@ type AuthRequestBody struct { AuthRequestId string `json:"id"` } -func (a AuthRequestBody) SetAuthRequestId(id string) { +func (a *AuthRequestBody) SetAuthRequestId(id string) { a.AuthRequestId = id } -func (a AuthRequestBody) GetAuthRequestId() string { +func (a *AuthRequestBody) GetAuthRequestId() string { return a.AuthRequestId } diff --git a/controller/oidc_auth/render.go b/controller/oidc_auth/render.go index abdfc3e7e..647906296 100644 --- a/controller/oidc_auth/render.go +++ b/controller/oidc_auth/render.go @@ -3,7 +3,6 @@ package oidc_auth import ( "encoding" "errors" - "fmt" "github.com/michaelquigley/pfxlog" "github.com/openziti/edge-api/rest_model" "github.com/openziti/foundation/v2/errorz" @@ -19,7 +18,7 @@ func render(w http.ResponseWriter, contentType string, status int, data encoding pfxlog.Logger().WithError(err).Error("could not marshal data payload, attempting to respond with a marshalling error") internalErr := &rest_model.APIError{ Code: errorz.UnhandledCode, - Message: fmt.Sprintf("could not marhsal, see cause"), + Message: "could not marshal, see cause", Cause: &rest_model.APIErrorCause{ APIError: rest_model.APIError{ Code: "UNHANDLED", @@ -43,6 +42,11 @@ func render(w http.ResponseWriter, contentType string, status int, data encoding w.WriteHeader(http.StatusInternalServerError) _, err = w.Write(internalErrPayload) + + if err != nil { + pfxlog.Logger().WithError(err).WithField("internalErrPayload", internalErrPayload).Error("could not write the internal error payload, giving up") + } + return } @@ -60,11 +64,6 @@ func renderJson(w http.ResponseWriter, status int, data encoding.BinaryMarshaler render(w, JsonContentType, status, data) } -// renderJson will attempt to render the provided data as text/html. -func renderHtml(w http.ResponseWriter, status int, data encoding.BinaryMarshaler) { - render(w, HtmlContentType, status, data) -} - func renderJsonError(w http.ResponseWriter, err error) { restErr, status := errorToRestApiError(err) renderJson(w, status, restErr) diff --git a/go.mod b/go.mod index e1742866b..de06fbe75 100644 --- a/go.mod +++ b/go.mod @@ -18,15 +18,15 @@ require ( github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa github.com/gaissmai/extnetip v0.4.0 github.com/go-acme/lego/v4 v4.15.0 - github.com/go-openapi/errors v0.21.0 - github.com/go-openapi/loads v0.21.5 - github.com/go-openapi/runtime v0.27.1 - github.com/go-openapi/spec v0.20.14 - github.com/go-openapi/strfmt v0.22.0 - github.com/go-openapi/swag v0.22.9 - github.com/go-openapi/validate v0.23.0 + github.com/go-openapi/errors v0.21.1 + github.com/go-openapi/loads v0.21.6 + github.com/go-openapi/runtime v0.27.2 + github.com/go-openapi/spec v0.20.15 + github.com/go-openapi/strfmt v0.22.2 + github.com/go-openapi/swag v0.22.10 + github.com/go-openapi/validate v0.23.2 github.com/go-resty/resty/v2 v2.11.0 - github.com/golang-jwt/jwt/v5 v5.2.0 + github.com/golang-jwt/jwt/v5 v5.2.1 github.com/google/go-cmp v0.6.0 github.com/google/gopacket v1.1.19 github.com/google/uuid v1.6.0 @@ -55,7 +55,7 @@ require ( github.com/openziti/jwks v1.0.3 github.com/openziti/metrics v1.2.45 github.com/openziti/runzmd v1.0.38 - github.com/openziti/sdk-golang v0.22.28 + github.com/openziti/sdk-golang v0.23.0 github.com/openziti/secretstream v0.1.16 github.com/openziti/storage v0.2.30 github.com/openziti/transport/v2 v2.0.122 @@ -67,22 +67,22 @@ require ( github.com/rabbitmq/amqp091-go v1.8.1 github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 github.com/russross/blackfriday v1.6.0 - github.com/shirou/gopsutil/v3 v3.24.1 + github.com/shirou/gopsutil/v3 v3.24.2 github.com/sirupsen/logrus v1.9.3 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e github.com/spf13/cobra v1.8.0 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.18.2 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 github.com/teris-io/shortid v0.0.0-20201117134242-e59966efd125 github.com/xeipuuv/gojsonschema v1.2.0 github.com/zitadel/oidc/v2 v2.12.0 go.etcd.io/bbolt v1.3.8 go4.org v0.0.0-20180809161055-417644f6feb5 - golang.org/x/crypto v0.19.0 - golang.org/x/net v0.21.0 + golang.org/x/crypto v0.21.0 + golang.org/x/net v0.22.0 golang.org/x/sync v0.6.0 - golang.org/x/sys v0.17.0 + golang.org/x/sys v0.18.0 golang.org/x/text v0.14.0 google.golang.org/protobuf v1.32.0 gopkg.in/AlecAivazis/survey.v1 v1.8.7 @@ -116,13 +116,13 @@ require ( github.com/go-logr/logr v1.4.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-openapi/analysis v0.22.2 // indirect - github.com/go-openapi/jsonpointer v0.20.2 // indirect - github.com/go-openapi/jsonreference v0.20.4 // indirect + github.com/go-openapi/analysis v0.22.3 // indirect + github.com/go-openapi/jsonpointer v0.20.3 // indirect + github.com/go-openapi/jsonreference v0.20.5 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/gomarkdown/markdown v0.0.0-20230922112808-5421fefb8386 // indirect - github.com/gorilla/schema v1.2.0 // indirect - github.com/gorilla/securecookie v1.1.1 // indirect + github.com/gorilla/schema v1.2.1 // indirect + github.com/gorilla/securecookie v1.1.2 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-msgpack v0.5.5 // indirect github.com/hashicorp/go-msgpack/v2 v2.1.1 // indirect @@ -135,7 +135,7 @@ require ( github.com/kr/pty v1.1.8 // indirect github.com/kyokomi/emoji/v2 v2.2.12 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed // indirect + github.com/lufia/plan9stats v0.0.0-20240226150601-1dcf7310316a // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect @@ -155,7 +155,7 @@ require ( github.com/pelletier/go-toml/v2 v2.1.0 // indirect github.com/pkg/term v1.2.0-beta.2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/rodaine/table v1.0.1 // indirect github.com/rs/cors v1.10.1 // indirect @@ -167,26 +167,26 @@ require ( github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.6.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect + github.com/tklauser/go-sysconf v0.3.13 // indirect + github.com/tklauser/numcpus v0.7.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect - github.com/yusufpapurcu/wmi v1.2.3 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect go.mongodb.org/mongo-driver v1.14.0 // indirect go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352 // indirect - go.opentelemetry.io/otel v1.23.1 // indirect - go.opentelemetry.io/otel/metric v1.23.1 // indirect - go.opentelemetry.io/otel/trace v1.23.1 // indirect + go.opentelemetry.io/otel v1.24.0 // indirect + go.opentelemetry.io/otel/metric v1.24.0 // indirect + go.opentelemetry.io/otel/trace v1.24.0 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.9.0 // indirect - golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect + golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect golang.org/x/image v0.13.0 // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/oauth2 v0.16.0 // indirect - golang.org/x/term v0.17.0 // indirect - golang.org/x/tools v0.17.0 // indirect + golang.org/x/mod v0.15.0 // indirect + golang.org/x/oauth2 v0.18.0 // indirect + golang.org/x/term v0.18.0 // indirect + golang.org/x/tools v0.18.0 // indirect google.golang.org/appengine v1.6.8 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect diff --git a/go.sum b/go.sum index cc2e357f8..a903e53bc 100644 --- a/go.sum +++ b/go.sum @@ -220,24 +220,44 @@ github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-openapi/analysis v0.22.2 h1:ZBmNoP2h5omLKr/srIC9bfqrUGzT6g6gNv03HE9Vpj0= github.com/go-openapi/analysis v0.22.2/go.mod h1:pDF4UbZsQTo/oNuRfAWWd4dAh4yuYf//LYorPTjrpvo= +github.com/go-openapi/analysis v0.22.3 h1:JfHesJsGyiNUlcDuuE1wg9QVQmXd6iB/TKCmHz9+P2U= +github.com/go-openapi/analysis v0.22.3/go.mod h1:y2vjQNdRVOg0gG88n7gBGKWm3yjNOlaTVkxBLHaNlts= github.com/go-openapi/errors v0.21.0 h1:FhChC/duCnfoLj1gZ0BgaBmzhJC2SL/sJr8a2vAobSY= github.com/go-openapi/errors v0.21.0/go.mod h1:jxNTMUxRCKj65yb/okJGEtahVd7uvWnuWfj53bse4ho= +github.com/go-openapi/errors v0.21.1 h1:rVisxQPdETctjlYntm0Ek4dKf68nAQocCloCT50vWuI= +github.com/go-openapi/errors v0.21.1/go.mod h1:LyiY9bgc7AVVh6wtVvMYEyoj3KJYNoRw92mmvnMWgj8= github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= +github.com/go-openapi/jsonpointer v0.20.3 h1:jykzYWS/kyGtsHfRt6aV8JTB9pcQAXPIA7qlZ5aRlyk= +github.com/go-openapi/jsonpointer v0.20.3/go.mod h1:c7l0rjoouAuIxCm8v/JWKRgMjDG/+/7UBWsXMrv6PsM= github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= +github.com/go-openapi/jsonreference v0.20.5 h1:hutI+cQI+HbSQaIGSfsBsYI0pHk+CATf8Fk5gCSj0yI= +github.com/go-openapi/jsonreference v0.20.5/go.mod h1:thAqAp31UABtI+FQGKAQfmv7DbFpKNUlva2UPCxKu2Y= github.com/go-openapi/loads v0.21.5 h1:jDzF4dSoHw6ZFADCGltDb2lE4F6De7aWSpe+IcsRzT0= github.com/go-openapi/loads v0.21.5/go.mod h1:PxTsnFBoBe+z89riT+wYt3prmSBP6GDAQh2l9H1Flz8= +github.com/go-openapi/loads v0.21.6 h1:qo9Ow4mbOe+epbJcFxPSYKVvPgHT+vvZRNC2BRatEeE= +github.com/go-openapi/loads v0.21.6/go.mod h1:eEquguZx+S9eigxJ7QhrzfhW1Me47n54wlHX9RK8to4= github.com/go-openapi/runtime v0.27.1 h1:ae53yaOoh+fx/X5Eaq8cRmavHgDma65XPZuvBqvJYto= github.com/go-openapi/runtime v0.27.1/go.mod h1:fijeJEiEclyS8BRurYE1DE5TLb9/KZl6eAdbzjsrlLU= +github.com/go-openapi/runtime v0.27.2 h1:AOvytl8s9DzL7B27r6dZ4sqjVOJT6/3LzKeZoDIAh+g= +github.com/go-openapi/runtime v0.27.2/go.mod h1:a5AkfzISU/Iwq51ZiQLM+oNRDwqC9RtlSt57xUSyZhg= github.com/go-openapi/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do= github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw= +github.com/go-openapi/spec v0.20.15 h1:8bDcVxF607pTh9NpPwgsH4J5Uhh5mV5XoWnkurdiY+U= +github.com/go-openapi/spec v0.20.15/go.mod h1:o0upgqg5uYFG7O5mADrDVmSG3Wa6y6OLhwiCqQ+sTv4= github.com/go-openapi/strfmt v0.22.0 h1:Ew9PnEYc246TwrEspvBdDHS4BVKXy/AOVsfqGDgAcaI= github.com/go-openapi/strfmt v0.22.0/go.mod h1:HzJ9kokGIju3/K6ap8jL+OlGAbjpSv27135Yr9OivU4= +github.com/go-openapi/strfmt v0.22.2 h1:DPYOrm6gexCfZZfXUaXFS4+Jw6HAaIIG0SZ5630f8yw= +github.com/go-openapi/strfmt v0.22.2/go.mod h1:HB/b7TCm91rno75Dembc1dFW/0FPLk5CEXsoF9ReNc4= github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE= github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE= +github.com/go-openapi/swag v0.22.10 h1:4y86NVn7Z2yYd6pfS4Z+Nyh3aAUL3Nul+LMbhFKy0gA= +github.com/go-openapi/swag v0.22.10/go.mod h1:Cnn8BYtRlx6BNE3DPN86f/xkapGIcLWzh3CLEb4C1jI= github.com/go-openapi/validate v0.23.0 h1:2l7PJLzCis4YUGEoW6eoQw3WhyM65WSIcjX6SQnlfDw= github.com/go-openapi/validate v0.23.0/go.mod h1:EeiAZ5bmpSIOJV1WLfyYF9qp/B1ZgSaEpHTJHtN5cbE= +github.com/go-openapi/validate v0.23.2 h1:dSV8fmCwFwTE6TYGVmWtpWN9aOTsidzcBsB2qPohZYI= +github.com/go-openapi/validate v0.23.2/go.mod h1:FencnMQqop3HPZk+wIkLsQHgOKP1EDAgF2LZDW7fWr8= github.com/go-resty/resty/v2 v2.11.0 h1:i7jMfNOJYMp69lq7qozJP+bjgzfAzeOhuGlyDrqxT/8= github.com/go-resty/resty/v2 v2.11.0/go.mod h1:iiP/OpA0CkcL3IGt1O0+/SIItFUbkkyw5BGXiVdTu+A= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -247,6 +267,8 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -338,8 +360,12 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/schema v1.2.0 h1:YufUaxZYCKGFuAq3c96BOhjgd5nmXiOY9NGzF247Tsc= github.com/gorilla/schema v1.2.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= +github.com/gorilla/schema v1.2.1 h1:tjDxcmdb+siIqkTNoV+qRH2mjYdr2hHe5MKXbp61ziM= +github.com/gorilla/schema v1.2.1/go.mod h1:Dg5SSm5PV60mhF2NFaTV1xuYYj8tV8NOPRo4FggUMnM= github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= +github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= @@ -458,6 +484,8 @@ github.com/lucsky/cuid v1.2.1/go.mod h1:QaaJqckboimOmhRSJXSx/+IT+VTfxfPGSo/6mfgU github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed h1:036IscGBfJsFIgJQzlui7nK1Ncm0tp2ktmPj8xO4N/0= github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= +github.com/lufia/plan9stats v0.0.0-20240226150601-1dcf7310316a h1:3Bm7EwfUQUvhNeKIkUct/gl9eod1TcXuj8stxvi/GoI= +github.com/lufia/plan9stats v0.0.0-20240226150601-1dcf7310316a/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= @@ -582,6 +610,10 @@ github.com/openziti/runzmd v1.0.38 h1:0eFWAf7R9Thx99ue7Gql2dBavsqv4jldU8W5AIZJ8w github.com/openziti/runzmd v1.0.38/go.mod h1:WiQi+YIXxZBH1bwjr+eo/e3ftfTLEABpN0i2QIhBI9w= github.com/openziti/sdk-golang v0.22.28 h1:s159CT42dXug4GiJiN/kM6/ol+N2LFZ2tUk6bOpbgiI= github.com/openziti/sdk-golang v0.22.28/go.mod h1:BLaLvcLqAgf3JFoDPWLTj3j3X5rndo6ZejdDdkMlihQ= +github.com/openziti/sdk-golang v0.22.31 h1:Ci2ljRoVhetkDhyRrIUx+xbbl81HL2zA1H2LzYldA3s= +github.com/openziti/sdk-golang v0.22.31/go.mod h1:EH3CwCHoDgDrQh5GR6ERMwYXUjE0z1olEoF1wakZC/Q= +github.com/openziti/sdk-golang v0.23.0 h1:0Sn/DSw206mMMSSWlWNKGKSxCvfT1FVWSKfCVQR/6wQ= +github.com/openziti/sdk-golang v0.23.0/go.mod h1:EH3CwCHoDgDrQh5GR6ERMwYXUjE0z1olEoF1wakZC/Q= github.com/openziti/secretstream v0.1.16 h1:tVanF7OpJL1MJ1gvWaRlR2i+kAbrGsxr3q6EXFOS08U= github.com/openziti/secretstream v0.1.16/go.mod h1:bvjGBUW/0e5MzD5S3FW3rhGASRNWAi+kTkTENZ9qRDE= github.com/openziti/storage v0.2.30 h1:15o8rSSgtcNCSBONt81ZRASQXJHh2L9Y0aWcHoQ81dE= @@ -620,6 +652,8 @@ github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndr github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b h1:0LFwY6Q3gMACTjAbMZBjXAqTOzOwFaj2Ld6cjeQ7Rig= github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= @@ -674,6 +708,8 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil/v3 v3.24.1 h1:R3t6ondCEvmARp3wxODhXMTLC/klMa87h2PHUw5m7QI= github.com/shirou/gopsutil/v3 v3.24.1/go.mod h1:UU7a2MSBQa+kW1uuDq8DeEBS8kmrnQwsv2b5O513rwU= +github.com/shirou/gopsutil/v3 v3.24.2 h1:kcR0erMbLg5/3LcInpw0X/rrPSqq4CDPyI6A6ZRC18Y= +github.com/shirou/gopsutil/v3 v3.24.2/go.mod h1:tSg/594BcA+8UdQU2XcW803GWYgdtauFFPgJCJKZlVk= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= @@ -747,6 +783,7 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.1 h1:4VhoImhV/Bm0ToFkXFi8hXNXwpDRZ/ynw3amt82mzq0= github.com/stretchr/objx v0.5.1/go.mod h1:/iHQpkQwBD6DLUmQ4pE+s1TXdob1mORJ4/UFdrifcy0= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -759,6 +796,8 @@ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1F github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= @@ -767,8 +806,12 @@ github.com/teris-io/shortid v0.0.0-20201117134242-e59966efd125 h1:3SNcvBmEPE1YlB github.com/teris-io/shortid v0.0.0-20201117134242-e59966efd125/go.mod h1:M8agBzgqHIhgj7wEn9/0hJUZcrvt9VY+Ln+S1I5Mha0= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= +github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= +github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= @@ -794,6 +837,8 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zitadel/oidc/v2 v2.12.0 h1:4aMTAy99/4pqNwrawEyJqhRb3yY3PtcDxnoDSryhpn4= github.com/zitadel/oidc/v2 v2.12.0/go.mod h1:LrRav74IiThHGapQgCHZOUNtnqJG0tcZKHro/91rtLw= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= @@ -816,12 +861,18 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/otel v1.23.1 h1:Za4UzOqJYS+MUczKI320AtqZHZb7EqxO00jAHE0jmQY= go.opentelemetry.io/otel v1.23.1/go.mod h1:Td0134eafDLcTS4y+zQ26GE8u3dEuRBiBCTUIRHaikA= +go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= go.opentelemetry.io/otel/metric v1.23.1 h1:PQJmqJ9u2QaJLBOELl1cxIdPcpbwzbkjfEyelTl2rlo= go.opentelemetry.io/otel/metric v1.23.1/go.mod h1:mpG2QPlAfnK8yNhNJAxDZruU9Y1/HubbC+KyH8FaCWI= +go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= +go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= go.opentelemetry.io/otel/sdk v1.17.0 h1:FLN2X66Ke/k5Sg3V623Q7h7nt3cHXaW1FOvKKrW0IpE= go.opentelemetry.io/otel/sdk v1.17.0/go.mod h1:U87sE0f5vQB7hwUoW98pW5Rz4ZDuCFBZFNUBlSgmDFQ= go.opentelemetry.io/otel/trace v1.23.1 h1:4LrmmEd8AU2rFvU1zegmvqW7+kWarxtNOPyeL6HmYY8= go.opentelemetry.io/otel/trace v1.23.1/go.mod h1:4IpnpJFwr1mo/6HL8XIPJaE9y0+u1KcVmuW7dwFSVrI= +go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= @@ -860,6 +911,8 @@ golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -872,6 +925,8 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= +golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= +golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -906,6 +961,7 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -960,6 +1016,8 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -976,6 +1034,8 @@ golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= +golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= +golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1074,6 +1134,8 @@ golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1082,6 +1144,8 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1163,6 +1227,7 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/router/internal/edgerouter/config.go b/router/internal/edgerouter/config.go index a18ec1ae4..532334194 100644 --- a/router/internal/edgerouter/config.go +++ b/router/internal/edgerouter/config.go @@ -148,7 +148,7 @@ func (config *Config) LoadConfigFromMap(configMap map[interface{}]interface{}) e configPath = strings.TrimSpace(configPath) config.Db = configPath + ".json.gzip" } else { - pfxlog.Logger().Warn("the db property was not set, using default for cached data model: %s", config.Db) + pfxlog.Logger().Warnf("the db property was not set, using default for cached data model: %s", config.Db) } pfxlog.Logger().Infof("cached data model file set to: %s", config.Db) diff --git a/router/xgress_edge/accept.go b/router/xgress_edge/accept.go index aa4d1962f..d15ef96e7 100644 --- a/router/xgress_edge/accept.go +++ b/router/xgress_edge/accept.go @@ -23,7 +23,6 @@ import ( "github.com/openziti/channel/v2/latency" "github.com/openziti/sdk-golang/ziti/edge" "github.com/openziti/ziti/common/cert" - "github.com/openziti/ziti/router/state" "math" ) @@ -32,7 +31,6 @@ type Acceptor struct { listener *listener options *channel.Options sessionBindHandler channel.BindHandler - manager state.Manager } func (self *Acceptor) BindChannel(binding channel.Binding) error { diff --git a/tests/.gitignore b/tests/.gitignore new file mode 100644 index 000000000..74b967cfb --- /dev/null +++ b/tests/.gitignore @@ -0,0 +1 @@ +*.json.gzip diff --git a/zititest/go.mod b/zititest/go.mod index 6245b9427..5b1d8e276 100644 --- a/zititest/go.mod +++ b/zititest/go.mod @@ -7,7 +7,7 @@ replace github.com/openziti/ziti => ../ require ( github.com/Jeffail/gabs v1.4.0 github.com/Jeffail/gabs/v2 v2.7.0 - github.com/go-openapi/runtime v0.27.1 + github.com/go-openapi/runtime v0.27.2 github.com/google/go-cmp v0.6.0 github.com/google/uuid v1.6.0 github.com/gorilla/websocket v1.5.1 @@ -18,7 +18,7 @@ require ( github.com/openziti/fablab v0.5.42 github.com/openziti/foundation/v2 v2.0.37 github.com/openziti/identity v1.0.70 - github.com/openziti/sdk-golang v0.22.28 + github.com/openziti/sdk-golang v0.23.0 github.com/openziti/storage v0.2.30 github.com/openziti/transport/v2 v2.0.122 github.com/openziti/ziti v0.28.3 @@ -26,9 +26,9 @@ require ( github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.8.0 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 go.etcd.io/bbolt v1.3.8 - golang.org/x/net v0.21.0 + golang.org/x/net v0.22.0 google.golang.org/protobuf v1.32.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -70,23 +70,23 @@ require ( github.com/go-logr/logr v1.4.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-openapi/analysis v0.22.2 // indirect - github.com/go-openapi/errors v0.21.0 // indirect - github.com/go-openapi/jsonpointer v0.20.2 // indirect - github.com/go-openapi/jsonreference v0.20.4 // indirect - github.com/go-openapi/loads v0.21.5 // indirect - github.com/go-openapi/spec v0.20.14 // indirect - github.com/go-openapi/strfmt v0.22.0 // indirect - github.com/go-openapi/swag v0.22.9 // indirect - github.com/go-openapi/validate v0.23.0 // indirect + github.com/go-openapi/analysis v0.22.3 // indirect + github.com/go-openapi/errors v0.21.1 // indirect + github.com/go-openapi/jsonpointer v0.20.3 // indirect + github.com/go-openapi/jsonreference v0.20.5 // indirect + github.com/go-openapi/loads v0.21.6 // indirect + github.com/go-openapi/spec v0.20.15 // indirect + github.com/go-openapi/strfmt v0.22.2 // indirect + github.com/go-openapi/swag v0.22.10 // indirect + github.com/go-openapi/validate v0.23.2 // indirect github.com/go-resty/resty/v2 v2.11.0 // indirect - github.com/golang-jwt/jwt/v5 v5.2.0 // indirect + github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/gomarkdown/markdown v0.0.0-20230922112808-5421fefb8386 // indirect github.com/gorilla/handlers v1.5.2 // indirect github.com/gorilla/mux v1.8.1 // indirect - github.com/gorilla/schema v1.2.0 // indirect - github.com/gorilla/securecookie v1.1.1 // indirect + github.com/gorilla/schema v1.2.1 // indirect + github.com/gorilla/securecookie v1.1.2 // indirect github.com/hashicorp/go-hclog v1.6.2 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-msgpack v0.5.5 // indirect @@ -112,7 +112,7 @@ require ( github.com/kyokomi/emoji/v2 v2.2.12 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/lucsky/cuid v1.2.1 // indirect - github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed // indirect + github.com/lufia/plan9stats v0.0.0-20240226150601-1dcf7310316a // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect @@ -149,7 +149,7 @@ require ( github.com/pkg/sftp v1.13.6 // indirect github.com/pkg/term v1.2.0-beta.2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/rabbitmq/amqp091-go v1.8.1 // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/rodaine/table v1.0.1 // indirect @@ -157,7 +157,7 @@ require ( github.com/russross/blackfriday v1.6.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect - github.com/shirou/gopsutil/v3 v3.24.1 // indirect + github.com/shirou/gopsutil/v3 v3.24.2 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect github.com/sourcegraph/conc v0.3.0 // indirect @@ -168,33 +168,33 @@ require ( github.com/spf13/viper v1.18.2 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/teris-io/shortid v0.0.0-20201117134242-e59966efd125 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect + github.com/tklauser/go-sysconf v0.3.13 // indirect + github.com/tklauser/numcpus v0.7.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect - github.com/yusufpapurcu/wmi v1.2.3 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect github.com/zitadel/oidc/v2 v2.12.0 // indirect go.mongodb.org/mongo-driver v1.14.0 // indirect go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352 // indirect - go.opentelemetry.io/otel v1.23.1 // indirect - go.opentelemetry.io/otel/metric v1.23.1 // indirect - go.opentelemetry.io/otel/trace v1.23.1 // indirect + go.opentelemetry.io/otel v1.24.0 // indirect + go.opentelemetry.io/otel/metric v1.24.0 // indirect + go.opentelemetry.io/otel/trace v1.24.0 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.9.0 // indirect go4.org v0.0.0-20180809161055-417644f6feb5 // indirect - golang.org/x/crypto v0.19.0 // indirect - golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect golang.org/x/image v0.13.0 // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/oauth2 v0.16.0 // indirect + golang.org/x/mod v0.15.0 // indirect + golang.org/x/oauth2 v0.18.0 // indirect golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.17.0 // indirect - golang.org/x/term v0.17.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/term v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.17.0 // indirect + golang.org/x/tools v0.18.0 // indirect google.golang.org/appengine v1.6.8 // indirect gopkg.in/AlecAivazis/survey.v1 v1.8.7 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/zititest/go.sum b/zititest/go.sum index dd53cdd95..daafb2c97 100644 --- a/zititest/go.sum +++ b/zititest/go.sum @@ -225,24 +225,34 @@ github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-openapi/analysis v0.22.2 h1:ZBmNoP2h5omLKr/srIC9bfqrUGzT6g6gNv03HE9Vpj0= github.com/go-openapi/analysis v0.22.2/go.mod h1:pDF4UbZsQTo/oNuRfAWWd4dAh4yuYf//LYorPTjrpvo= +github.com/go-openapi/analysis v0.22.3/go.mod h1:y2vjQNdRVOg0gG88n7gBGKWm3yjNOlaTVkxBLHaNlts= github.com/go-openapi/errors v0.21.0 h1:FhChC/duCnfoLj1gZ0BgaBmzhJC2SL/sJr8a2vAobSY= github.com/go-openapi/errors v0.21.0/go.mod h1:jxNTMUxRCKj65yb/okJGEtahVd7uvWnuWfj53bse4ho= +github.com/go-openapi/errors v0.21.1/go.mod h1:LyiY9bgc7AVVh6wtVvMYEyoj3KJYNoRw92mmvnMWgj8= github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= +github.com/go-openapi/jsonpointer v0.20.3/go.mod h1:c7l0rjoouAuIxCm8v/JWKRgMjDG/+/7UBWsXMrv6PsM= github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= +github.com/go-openapi/jsonreference v0.20.5/go.mod h1:thAqAp31UABtI+FQGKAQfmv7DbFpKNUlva2UPCxKu2Y= github.com/go-openapi/loads v0.21.5 h1:jDzF4dSoHw6ZFADCGltDb2lE4F6De7aWSpe+IcsRzT0= github.com/go-openapi/loads v0.21.5/go.mod h1:PxTsnFBoBe+z89riT+wYt3prmSBP6GDAQh2l9H1Flz8= +github.com/go-openapi/loads v0.21.6/go.mod h1:eEquguZx+S9eigxJ7QhrzfhW1Me47n54wlHX9RK8to4= github.com/go-openapi/runtime v0.27.1 h1:ae53yaOoh+fx/X5Eaq8cRmavHgDma65XPZuvBqvJYto= github.com/go-openapi/runtime v0.27.1/go.mod h1:fijeJEiEclyS8BRurYE1DE5TLb9/KZl6eAdbzjsrlLU= +github.com/go-openapi/runtime v0.27.2/go.mod h1:a5AkfzISU/Iwq51ZiQLM+oNRDwqC9RtlSt57xUSyZhg= github.com/go-openapi/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do= github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw= +github.com/go-openapi/spec v0.20.15/go.mod h1:o0upgqg5uYFG7O5mADrDVmSG3Wa6y6OLhwiCqQ+sTv4= github.com/go-openapi/strfmt v0.22.0 h1:Ew9PnEYc246TwrEspvBdDHS4BVKXy/AOVsfqGDgAcaI= github.com/go-openapi/strfmt v0.22.0/go.mod h1:HzJ9kokGIju3/K6ap8jL+OlGAbjpSv27135Yr9OivU4= +github.com/go-openapi/strfmt v0.22.2/go.mod h1:HB/b7TCm91rno75Dembc1dFW/0FPLk5CEXsoF9ReNc4= github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE= github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE= +github.com/go-openapi/swag v0.22.10/go.mod h1:Cnn8BYtRlx6BNE3DPN86f/xkapGIcLWzh3CLEb4C1jI= github.com/go-openapi/validate v0.23.0 h1:2l7PJLzCis4YUGEoW6eoQw3WhyM65WSIcjX6SQnlfDw= github.com/go-openapi/validate v0.23.0/go.mod h1:EeiAZ5bmpSIOJV1WLfyYF9qp/B1ZgSaEpHTJHtN5cbE= +github.com/go-openapi/validate v0.23.2/go.mod h1:FencnMQqop3HPZk+wIkLsQHgOKP1EDAgF2LZDW7fWr8= github.com/go-resty/resty/v2 v2.11.0 h1:i7jMfNOJYMp69lq7qozJP+bjgzfAzeOhuGlyDrqxT/8= github.com/go-resty/resty/v2 v2.11.0/go.mod h1:iiP/OpA0CkcL3IGt1O0+/SIItFUbkkyw5BGXiVdTu+A= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -252,6 +262,7 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -341,8 +352,10 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/schema v1.2.0 h1:YufUaxZYCKGFuAq3c96BOhjgd5nmXiOY9NGzF247Tsc= github.com/gorilla/schema v1.2.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= +github.com/gorilla/schema v1.2.1/go.mod h1:Dg5SSm5PV60mhF2NFaTV1xuYYj8tV8NOPRo4FggUMnM= github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= @@ -472,6 +485,7 @@ github.com/lucsky/cuid v1.2.1/go.mod h1:QaaJqckboimOmhRSJXSx/+IT+VTfxfPGSo/6mfgU github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed h1:036IscGBfJsFIgJQzlui7nK1Ncm0tp2ktmPj8xO4N/0= github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= +github.com/lufia/plan9stats v0.0.0-20240226150601-1dcf7310316a/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= @@ -606,6 +620,8 @@ github.com/openziti/runzmd v1.0.38 h1:0eFWAf7R9Thx99ue7Gql2dBavsqv4jldU8W5AIZJ8w github.com/openziti/runzmd v1.0.38/go.mod h1:WiQi+YIXxZBH1bwjr+eo/e3ftfTLEABpN0i2QIhBI9w= github.com/openziti/sdk-golang v0.22.28 h1:s159CT42dXug4GiJiN/kM6/ol+N2LFZ2tUk6bOpbgiI= github.com/openziti/sdk-golang v0.22.28/go.mod h1:BLaLvcLqAgf3JFoDPWLTj3j3X5rndo6ZejdDdkMlihQ= +github.com/openziti/sdk-golang v0.22.31/go.mod h1:EH3CwCHoDgDrQh5GR6ERMwYXUjE0z1olEoF1wakZC/Q= +github.com/openziti/sdk-golang v0.23.0/go.mod h1:EH3CwCHoDgDrQh5GR6ERMwYXUjE0z1olEoF1wakZC/Q= github.com/openziti/secretstream v0.1.16 h1:tVanF7OpJL1MJ1gvWaRlR2i+kAbrGsxr3q6EXFOS08U= github.com/openziti/secretstream v0.1.16/go.mod h1:bvjGBUW/0e5MzD5S3FW3rhGASRNWAi+kTkTENZ9qRDE= github.com/openziti/storage v0.2.30 h1:15o8rSSgtcNCSBONt81ZRASQXJHh2L9Y0aWcHoQ81dE= @@ -646,6 +662,7 @@ github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndr github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b h1:0LFwY6Q3gMACTjAbMZBjXAqTOzOwFaj2Ld6cjeQ7Rig= github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= @@ -700,6 +717,7 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil/v3 v3.24.1 h1:R3t6ondCEvmARp3wxODhXMTLC/klMa87h2PHUw5m7QI= github.com/shirou/gopsutil/v3 v3.24.1/go.mod h1:UU7a2MSBQa+kW1uuDq8DeEBS8kmrnQwsv2b5O513rwU= +github.com/shirou/gopsutil/v3 v3.24.2/go.mod h1:tSg/594BcA+8UdQU2XcW803GWYgdtauFFPgJCJKZlVk= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= @@ -786,6 +804,7 @@ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1F github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= @@ -794,8 +813,10 @@ github.com/teris-io/shortid v0.0.0-20201117134242-e59966efd125 h1:3SNcvBmEPE1YlB github.com/teris-io/shortid v0.0.0-20201117134242-e59966efd125/go.mod h1:M8agBzgqHIhgj7wEn9/0hJUZcrvt9VY+Ln+S1I5Mha0= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= @@ -821,6 +842,7 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zitadel/oidc/v2 v2.12.0 h1:4aMTAy99/4pqNwrawEyJqhRb3yY3PtcDxnoDSryhpn4= github.com/zitadel/oidc/v2 v2.12.0/go.mod h1:LrRav74IiThHGapQgCHZOUNtnqJG0tcZKHro/91rtLw= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= @@ -843,12 +865,15 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/otel v1.23.1 h1:Za4UzOqJYS+MUczKI320AtqZHZb7EqxO00jAHE0jmQY= go.opentelemetry.io/otel v1.23.1/go.mod h1:Td0134eafDLcTS4y+zQ26GE8u3dEuRBiBCTUIRHaikA= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= go.opentelemetry.io/otel/metric v1.23.1 h1:PQJmqJ9u2QaJLBOELl1cxIdPcpbwzbkjfEyelTl2rlo= go.opentelemetry.io/otel/metric v1.23.1/go.mod h1:mpG2QPlAfnK8yNhNJAxDZruU9Y1/HubbC+KyH8FaCWI= +go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= go.opentelemetry.io/otel/sdk v1.17.0 h1:FLN2X66Ke/k5Sg3V623Q7h7nt3cHXaW1FOvKKrW0IpE= go.opentelemetry.io/otel/sdk v1.17.0/go.mod h1:U87sE0f5vQB7hwUoW98pW5Rz4ZDuCFBZFNUBlSgmDFQ= go.opentelemetry.io/otel/trace v1.23.1 h1:4LrmmEd8AU2rFvU1zegmvqW7+kWarxtNOPyeL6HmYY8= go.opentelemetry.io/otel/trace v1.23.1/go.mod h1:4IpnpJFwr1mo/6HL8XIPJaE9y0+u1KcVmuW7dwFSVrI= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= @@ -887,6 +912,7 @@ golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -899,6 +925,7 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= +golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -933,6 +960,7 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -987,6 +1015,7 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1003,6 +1032,7 @@ golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= +golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1101,6 +1131,7 @@ golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1109,6 +1140,7 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1190,6 +1222,7 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From bc140c87dfd2f7f04b8f28019323f2bb3c334340 Mon Sep 17 00:00:00 2001 From: Andrew Martinez Date: Wed, 6 Mar 2024 10:04:58 -0500 Subject: [PATCH 06/29] reorganizes methods to be grouped by type --- common/event_cache.go | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/common/event_cache.go b/common/event_cache.go index ff9c9d0bc..c780911c6 100644 --- a/common/event_cache.go +++ b/common/event_cache.go @@ -88,22 +88,6 @@ func (cache *ForgetfulEventCache) ReplayFrom(_ uint64) ([]*edge_ctrl_pb.DataStat return nil, false } -func NewLoggingEventCache(logSize uint64) *LoggingEventCache { - return &LoggingEventCache{ - HeadLogIndex: 0, - LogSize: logSize, - Log: make([]uint64, logSize), - Events: map[uint64]*edge_ctrl_pb.DataState_Event{}, - } -} - -func (cache *LoggingEventCache) WhileLocked(callback func(uint64, bool)) { - cache.lock.Lock() - defer cache.lock.Unlock() - - callback(cache.currentIndex()) -} - func (cache *ForgetfulEventCache) CurrentIndex() (uint64, bool) { cache.lock.Lock() defer cache.lock.Unlock() @@ -128,6 +112,15 @@ type LoggingEventCache struct { Events map[uint64]*edge_ctrl_pb.DataState_Event } +func NewLoggingEventCache(logSize uint64) *LoggingEventCache { + return &LoggingEventCache{ + HeadLogIndex: 0, + LogSize: logSize, + Log: make([]uint64, logSize), + Events: map[uint64]*edge_ctrl_pb.DataState_Event{}, + } +} + func (cache *LoggingEventCache) SetCurrentIndex(index uint64) { cache.lock.Lock() defer cache.lock.Unlock() @@ -138,6 +131,13 @@ func (cache *LoggingEventCache) SetCurrentIndex(index uint64) { cache.Events = map[uint64]*edge_ctrl_pb.DataState_Event{} } +func (cache *LoggingEventCache) WhileLocked(callback func(uint64, bool)) { + cache.lock.Lock() + defer cache.lock.Unlock() + + callback(cache.currentIndex()) +} + func (cache *LoggingEventCache) Store(event *edge_ctrl_pb.DataState_Event, onSuccess OnStoreSuccess) error { cache.lock.Lock() defer cache.lock.Unlock() From 22519e8b5b3e0fbd479d064a5f9e845484b1b6bb Mon Sep 17 00:00:00 2001 From: Andrew Martinez Date: Wed, 6 Mar 2024 10:06:54 -0500 Subject: [PATCH 07/29] remove unreachable code --- common/event_cache.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/common/event_cache.go b/common/event_cache.go index c780911c6..c3fc70ed5 100644 --- a/common/event_cache.go +++ b/common/event_cache.go @@ -65,11 +65,6 @@ func (cache *ForgetfulEventCache) Store(event *edge_ctrl_pb.DataState_Event, onS } if cache.index != nil { - if *cache.index >= event.Index { - //already past this index - return nil - } - if *cache.index >= event.Index { return fmt.Errorf("out of order event detected, currentIndex: %d, recievedIndex: %d, type :%T", *cache.index, event.Index, cache) } From 7d8a84fe08654b939964657df0f62debb3aac77a Mon Sep 17 00:00:00 2001 From: Andrew Martinez Date: Wed, 6 Mar 2024 10:08:29 -0500 Subject: [PATCH 08/29] add locking on index set for forgetful index --- common/event_cache.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/event_cache.go b/common/event_cache.go index c3fc70ed5..0100dcb4f 100644 --- a/common/event_cache.go +++ b/common/event_cache.go @@ -43,6 +43,8 @@ func NewForgetfulEventCache() *ForgetfulEventCache { } func (cache *ForgetfulEventCache) SetCurrentIndex(index uint64) { + cache.lock.Lock() + defer cache.lock.Unlock() cache.index = &index } From 96ed30a200500e81cbc0b90ac6dc788084e0236a Mon Sep 17 00:00:00 2001 From: Andrew Martinez Date: Wed, 6 Mar 2024 10:18:02 -0500 Subject: [PATCH 09/29] fix store entity type copy-pasta --- controller/db/controller_store.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controller/db/controller_store.go b/controller/db/controller_store.go index c0d64bd7e..b83180bc5 100644 --- a/controller/db/controller_store.go +++ b/controller/db/controller_store.go @@ -45,7 +45,7 @@ func (entity *Controller) GetName() string { } func (entity *Controller) GetEntityType() string { - return EntityTypeCas + return EntityTypeControllers } var _ ControllerStore = (*controllerStoreImpl)(nil) From 281730bcab92f952e595ea4cc080fd4d5d450940 Mon Sep 17 00:00:00 2001 From: Andrew Martinez Date: Wed, 6 Mar 2024 10:24:55 -0500 Subject: [PATCH 10/29] fix nil panic --- router/xgress_edge/connections.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/router/xgress_edge/connections.go b/router/xgress_edge/connections.go index f825b2e71..2ff0ce46c 100644 --- a/router/xgress_edge/connections.go +++ b/router/xgress_edge/connections.go @@ -69,10 +69,6 @@ func (handler *sessionConnectionHandler) BindChannel(binding channel.Binding) er apiSession := handler.stateManager.GetApiSessionWithTimeout(token, handler.options.lookupApiSessionTimeout) - if apiSession.Claims != nil { - token = apiSession.Claims.ApiSessionId - } - if apiSession == nil { _ = ch.Close() @@ -90,6 +86,10 @@ func (handler *sessionConnectionHandler) BindChannel(binding channel.Binding) er return fmt.Errorf("no api session found for token [%s], fingerprints: [%v], subjects [%v]", token, fingerprints, subjects) } + if apiSession.Claims != nil { + token = apiSession.Claims.ApiSessionId + } + for _, fingerprint := range apiSession.CertFingerprints { if fingerprints.Contains(fingerprint) { removeListener := handler.stateManager.AddApiSessionRemovedListener(token, func(token string) { From 31e8d2c2fcbfe0bd9f7e16f4096176ed294ce53c Mon Sep 17 00:00:00 2001 From: Kenneth Bingham Date: Sat, 9 Mar 2024 18:37:03 -0500 Subject: [PATCH 11/29] add healthcheck and normalize vars --- quickstart/docker/all-in-one/compose.yml | 30 ++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/quickstart/docker/all-in-one/compose.yml b/quickstart/docker/all-in-one/compose.yml index bea573164..75b445c35 100644 --- a/quickstart/docker/all-in-one/compose.yml +++ b/quickstart/docker/all-in-one/compose.yml @@ -23,7 +23,7 @@ services: ZITI_CMD+=" --ctrl-address ${EXTERNAL_DNS:-quickstart}"\ " --ctrl-port ${ZITI_CTRL_EDGE_ADVERTISED_PORT:-1280}"\ " --router-address ${EXTERNAL_DNS:-quickstart}"\ - " --router-port ${ZITI_ROUTER_PORT:-3022}"\ + " --router-port ${ZITI_ROUTER_ADVERTISED_PORT:-3022}"\ " --password ${ZITI_PWD:-admin}" echo "DEBUG: run command is: ziti $${@} $${ZITI_CMD}" exec ziti "$${@}" $${ZITI_CMD} @@ -38,13 +38,27 @@ services: - ${ZITI_HOME:-ziti_home}:/home/ziggy ports: - ${ZITI_INTERFACE:-0.0.0.0}:${ZITI_CTRL_EDGE_ADVERTISED_PORT:-1280}:${ZITI_CTRL_EDGE_ADVERTISED_PORT:-1280} - - ${ZITI_INTERFACE:-0.0.0.0}:${ZITI_ROUTER_PORT:-3022}:${ZITI_ROUTER_PORT:-3022} + - ${ZITI_INTERFACE:-0.0.0.0}:${ZITI_ROUTER_ADVERTISED_PORT:-3022}:${ZITI_ROUTER_ADVERTISED_PORT:-3022} + expose: + - ${ZITI_CTRL_EDGE_ADVERTISED_PORT:-1280} + - ${ZITI_ROUTER_ADVERTISED_PORT:-3022} depends_on: - initialize: + quickstart-init: condition: service_completed_successfully + healthcheck: + test: + - CMD + - ziti + - agent + - stats + interval: 3s + timeout: 3s + retries: 5 + start_period: 30s + # this service is used to initialize the ziti_home volume by setting the owner to the UID of the user running the # quickstart container - initialize: + quickstart-init: image: busybox command: chown -Rc ${ZIGGY_UID:-1000} /home/ziggy user: root @@ -55,6 +69,14 @@ services: # directory, ZITI_HOME - ${ZITI_HOME:-ziti_home}:/home/ziggy + # add a health check for the quickstart network + quickstart-check: + image: busybox + command: echo "Ziti is cooking" + depends_on: + quickstart: + condition: service_healthy + # define a custom network so that we can also define a DNS alias for the quickstart container networks: quickstart: From 804871dd0112fb621bc17ec13ad46caf8f391047 Mon Sep 17 00:00:00 2001 From: Andrew Martinez Date: Mon, 11 Mar 2024 08:39:59 -0400 Subject: [PATCH 12/29] update sdk-golang dep, remove optional secret value from at configs --- go.mod | 28 +++++----- go.sum | 130 ++++++++++++--------------------------------- tests/ats-ctrl.yml | 1 - 3 files changed, 49 insertions(+), 110 deletions(-) diff --git a/go.mod b/go.mod index de06fbe75..eec3011c0 100644 --- a/go.mod +++ b/go.mod @@ -18,13 +18,13 @@ require ( github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa github.com/gaissmai/extnetip v0.4.0 github.com/go-acme/lego/v4 v4.15.0 - github.com/go-openapi/errors v0.21.1 - github.com/go-openapi/loads v0.21.6 - github.com/go-openapi/runtime v0.27.2 - github.com/go-openapi/spec v0.20.15 - github.com/go-openapi/strfmt v0.22.2 - github.com/go-openapi/swag v0.22.10 - github.com/go-openapi/validate v0.23.2 + github.com/go-openapi/errors v0.22.0 + github.com/go-openapi/loads v0.22.0 + github.com/go-openapi/runtime v0.28.0 + github.com/go-openapi/spec v0.21.0 + github.com/go-openapi/strfmt v0.23.0 + github.com/go-openapi/swag v0.23.0 + github.com/go-openapi/validate v0.24.0 github.com/go-resty/resty/v2 v2.11.0 github.com/golang-jwt/jwt/v5 v5.2.1 github.com/google/go-cmp v0.6.0 @@ -49,13 +49,13 @@ require ( github.com/natefinch/lumberjack v2.0.0+incompatible github.com/openziti/agent v1.0.16 github.com/openziti/channel/v2 v2.0.119 - github.com/openziti/edge-api v0.26.11 + github.com/openziti/edge-api v0.26.12 github.com/openziti/foundation/v2 v2.0.37 github.com/openziti/identity v1.0.70 github.com/openziti/jwks v1.0.3 github.com/openziti/metrics v1.2.45 github.com/openziti/runzmd v1.0.38 - github.com/openziti/sdk-golang v0.23.0 + github.com/openziti/sdk-golang v0.23.3 github.com/openziti/secretstream v0.1.16 github.com/openziti/storage v0.2.30 github.com/openziti/transport/v2 v2.0.122 @@ -84,7 +84,7 @@ require ( golang.org/x/sync v0.6.0 golang.org/x/sys v0.18.0 golang.org/x/text v0.14.0 - google.golang.org/protobuf v1.32.0 + google.golang.org/protobuf v1.33.0 gopkg.in/AlecAivazis/survey.v1 v1.8.7 gopkg.in/resty.v1 v1.12.0 gopkg.in/square/go-jose.v2 v2.6.0 @@ -116,10 +116,10 @@ require ( github.com/go-logr/logr v1.4.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-openapi/analysis v0.22.3 // indirect - github.com/go-openapi/jsonpointer v0.20.3 // indirect - github.com/go-openapi/jsonreference v0.20.5 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/go-openapi/analysis v0.23.0 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/gomarkdown/markdown v0.0.0-20230922112808-5421fefb8386 // indirect github.com/gorilla/schema v1.2.1 // indirect github.com/gorilla/securecookie v1.1.2 // indirect diff --git a/go.sum b/go.sum index a903e53bc..f0e9b31e8 100644 --- a/go.sum +++ b/go.sum @@ -218,46 +218,26 @@ github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-openapi/analysis v0.22.2 h1:ZBmNoP2h5omLKr/srIC9bfqrUGzT6g6gNv03HE9Vpj0= -github.com/go-openapi/analysis v0.22.2/go.mod h1:pDF4UbZsQTo/oNuRfAWWd4dAh4yuYf//LYorPTjrpvo= -github.com/go-openapi/analysis v0.22.3 h1:JfHesJsGyiNUlcDuuE1wg9QVQmXd6iB/TKCmHz9+P2U= -github.com/go-openapi/analysis v0.22.3/go.mod h1:y2vjQNdRVOg0gG88n7gBGKWm3yjNOlaTVkxBLHaNlts= -github.com/go-openapi/errors v0.21.0 h1:FhChC/duCnfoLj1gZ0BgaBmzhJC2SL/sJr8a2vAobSY= -github.com/go-openapi/errors v0.21.0/go.mod h1:jxNTMUxRCKj65yb/okJGEtahVd7uvWnuWfj53bse4ho= -github.com/go-openapi/errors v0.21.1 h1:rVisxQPdETctjlYntm0Ek4dKf68nAQocCloCT50vWuI= -github.com/go-openapi/errors v0.21.1/go.mod h1:LyiY9bgc7AVVh6wtVvMYEyoj3KJYNoRw92mmvnMWgj8= -github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= -github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= -github.com/go-openapi/jsonpointer v0.20.3 h1:jykzYWS/kyGtsHfRt6aV8JTB9pcQAXPIA7qlZ5aRlyk= -github.com/go-openapi/jsonpointer v0.20.3/go.mod h1:c7l0rjoouAuIxCm8v/JWKRgMjDG/+/7UBWsXMrv6PsM= -github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= -github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= -github.com/go-openapi/jsonreference v0.20.5 h1:hutI+cQI+HbSQaIGSfsBsYI0pHk+CATf8Fk5gCSj0yI= -github.com/go-openapi/jsonreference v0.20.5/go.mod h1:thAqAp31UABtI+FQGKAQfmv7DbFpKNUlva2UPCxKu2Y= -github.com/go-openapi/loads v0.21.5 h1:jDzF4dSoHw6ZFADCGltDb2lE4F6De7aWSpe+IcsRzT0= -github.com/go-openapi/loads v0.21.5/go.mod h1:PxTsnFBoBe+z89riT+wYt3prmSBP6GDAQh2l9H1Flz8= -github.com/go-openapi/loads v0.21.6 h1:qo9Ow4mbOe+epbJcFxPSYKVvPgHT+vvZRNC2BRatEeE= -github.com/go-openapi/loads v0.21.6/go.mod h1:eEquguZx+S9eigxJ7QhrzfhW1Me47n54wlHX9RK8to4= -github.com/go-openapi/runtime v0.27.1 h1:ae53yaOoh+fx/X5Eaq8cRmavHgDma65XPZuvBqvJYto= -github.com/go-openapi/runtime v0.27.1/go.mod h1:fijeJEiEclyS8BRurYE1DE5TLb9/KZl6eAdbzjsrlLU= -github.com/go-openapi/runtime v0.27.2 h1:AOvytl8s9DzL7B27r6dZ4sqjVOJT6/3LzKeZoDIAh+g= -github.com/go-openapi/runtime v0.27.2/go.mod h1:a5AkfzISU/Iwq51ZiQLM+oNRDwqC9RtlSt57xUSyZhg= -github.com/go-openapi/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do= -github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw= -github.com/go-openapi/spec v0.20.15 h1:8bDcVxF607pTh9NpPwgsH4J5Uhh5mV5XoWnkurdiY+U= -github.com/go-openapi/spec v0.20.15/go.mod h1:o0upgqg5uYFG7O5mADrDVmSG3Wa6y6OLhwiCqQ+sTv4= -github.com/go-openapi/strfmt v0.22.0 h1:Ew9PnEYc246TwrEspvBdDHS4BVKXy/AOVsfqGDgAcaI= -github.com/go-openapi/strfmt v0.22.0/go.mod h1:HzJ9kokGIju3/K6ap8jL+OlGAbjpSv27135Yr9OivU4= -github.com/go-openapi/strfmt v0.22.2 h1:DPYOrm6gexCfZZfXUaXFS4+Jw6HAaIIG0SZ5630f8yw= -github.com/go-openapi/strfmt v0.22.2/go.mod h1:HB/b7TCm91rno75Dembc1dFW/0FPLk5CEXsoF9ReNc4= -github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE= -github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE= -github.com/go-openapi/swag v0.22.10 h1:4y86NVn7Z2yYd6pfS4Z+Nyh3aAUL3Nul+LMbhFKy0gA= -github.com/go-openapi/swag v0.22.10/go.mod h1:Cnn8BYtRlx6BNE3DPN86f/xkapGIcLWzh3CLEb4C1jI= -github.com/go-openapi/validate v0.23.0 h1:2l7PJLzCis4YUGEoW6eoQw3WhyM65WSIcjX6SQnlfDw= -github.com/go-openapi/validate v0.23.0/go.mod h1:EeiAZ5bmpSIOJV1WLfyYF9qp/B1ZgSaEpHTJHtN5cbE= -github.com/go-openapi/validate v0.23.2 h1:dSV8fmCwFwTE6TYGVmWtpWN9aOTsidzcBsB2qPohZYI= -github.com/go-openapi/validate v0.23.2/go.mod h1:FencnMQqop3HPZk+wIkLsQHgOKP1EDAgF2LZDW7fWr8= +github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU= +github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo= +github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w= +github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/loads v0.22.0 h1:ECPGd4jX1U6NApCGG1We+uEozOAvXvJSF4nnwHZ8Aco= +github.com/go-openapi/loads v0.22.0/go.mod h1:yLsaTCS92mnSAZX5WWoxszLj0u+Ojl+Zs5Stn1oF+rs= +github.com/go-openapi/runtime v0.28.0 h1:gpPPmWSNGo214l6n8hzdXYhPuJcGtziTOgUpvsFWGIQ= +github.com/go-openapi/runtime v0.28.0/go.mod h1:QN7OzcS+XuYmkQLw05akXk0jRH/eZ3kb18+1KwW9gyc= +github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= +github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= +github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c= +github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58= +github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ= github.com/go-resty/resty/v2 v2.11.0 h1:i7jMfNOJYMp69lq7qozJP+bjgzfAzeOhuGlyDrqxT/8= github.com/go-resty/resty/v2 v2.11.0/go.mod h1:iiP/OpA0CkcL3IGt1O0+/SIItFUbkkyw5BGXiVdTu+A= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -265,8 +245,6 @@ github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= -github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -303,8 +281,8 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/gomarkdown/markdown v0.0.0-20191123064959-2c17d62f5098/go.mod h1:aii0r/K0ZnHv7G0KF7xy1v0A7s2Ljrb5byB7MO5p6TU= github.com/gomarkdown/markdown v0.0.0-20230922112808-5421fefb8386 h1:EcQR3gusLHN46TAD+G+EbaaqJArt5vHhNpXAa12PQf4= @@ -329,6 +307,8 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -358,12 +338,8 @@ github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyE github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/schema v1.2.0 h1:YufUaxZYCKGFuAq3c96BOhjgd5nmXiOY9NGzF247Tsc= -github.com/gorilla/schema v1.2.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= github.com/gorilla/schema v1.2.1 h1:tjDxcmdb+siIqkTNoV+qRH2mjYdr2hHe5MKXbp61ziM= github.com/gorilla/schema v1.2.1/go.mod h1:Dg5SSm5PV60mhF2NFaTV1xuYYj8tV8NOPRo4FggUMnM= -github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -482,8 +458,6 @@ github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i github.com/lucsky/cuid v1.2.1 h1:MtJrL2OFhvYufUIn48d35QGXyeTC8tn0upumW9WwTHg= github.com/lucsky/cuid v1.2.1/go.mod h1:QaaJqckboimOmhRSJXSx/+IT+VTfxfPGSo/6mfgUfmE= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed h1:036IscGBfJsFIgJQzlui7nK1Ncm0tp2ktmPj8xO4N/0= -github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= github.com/lufia/plan9stats v0.0.0-20240226150601-1dcf7310316a h1:3Bm7EwfUQUvhNeKIkUct/gl9eod1TcXuj8stxvi/GoI= github.com/lufia/plan9stats v0.0.0-20240226150601-1dcf7310316a/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= @@ -596,8 +570,8 @@ github.com/openziti/channel/v2 v2.0.119 h1:stfSrnDqoTi78LMvQA3+NSivHjQnRrYKrgij5 github.com/openziti/channel/v2 v2.0.119/go.mod h1:lSRJwqmbkE34DgXYEmUhVCzwcQcx65vZGE8nuBNK458= github.com/openziti/dilithium v0.3.3 h1:PLgQ6PMNLSTzCFbX/h98cmudgz/cU6TmjdSv5NAPD8k= github.com/openziti/dilithium v0.3.3/go.mod h1:vsCjI2AU/hon9e+dLhUFbCNGesJDj2ASgkySOcpmvjo= -github.com/openziti/edge-api v0.26.11 h1:qINsfGpPBTnbuDrOq+qcMZuBdlXosqvHX7sQhLA+cM4= -github.com/openziti/edge-api v0.26.11/go.mod h1:30SiUmR+9gOBi9HUZgXLpCO2nNCbNFVx2jwXV2Dh4Og= +github.com/openziti/edge-api v0.26.12 h1:5VRz0cWtfQq2rhSA7Ne6amM7YNI6pQGRfNgbKt0g6kQ= +github.com/openziti/edge-api v0.26.12/go.mod h1:tKZRUFDB9zM5J1zBS0ok2r40OhJqWykZaU9HSBQgr8w= github.com/openziti/foundation/v2 v2.0.37 h1:7pa4vWrlwllEoLXaK2rx91AffLQJ8k5pvc92oWANavA= github.com/openziti/foundation/v2 v2.0.37/go.mod h1:2NxzCnJbMw35U9RrFcdEaiXdxIMfBHOUNPngpyhvKeY= github.com/openziti/identity v1.0.70 h1:JNwtJHmIS0DcXookm2xuXyh4z92T1O21GQvuO8PmHWs= @@ -608,12 +582,8 @@ github.com/openziti/metrics v1.2.45 h1:+3zqszLWyFdTgzbsQD90V0yJcC9Ek77qKaIGMQXkA github.com/openziti/metrics v1.2.45/go.mod h1:g6CgAEbFes2UtdfGrsR8AKkuoBVL5dkU61843uQvllM= github.com/openziti/runzmd v1.0.38 h1:0eFWAf7R9Thx99ue7Gql2dBavsqv4jldU8W5AIZJ8wo= github.com/openziti/runzmd v1.0.38/go.mod h1:WiQi+YIXxZBH1bwjr+eo/e3ftfTLEABpN0i2QIhBI9w= -github.com/openziti/sdk-golang v0.22.28 h1:s159CT42dXug4GiJiN/kM6/ol+N2LFZ2tUk6bOpbgiI= -github.com/openziti/sdk-golang v0.22.28/go.mod h1:BLaLvcLqAgf3JFoDPWLTj3j3X5rndo6ZejdDdkMlihQ= -github.com/openziti/sdk-golang v0.22.31 h1:Ci2ljRoVhetkDhyRrIUx+xbbl81HL2zA1H2LzYldA3s= -github.com/openziti/sdk-golang v0.22.31/go.mod h1:EH3CwCHoDgDrQh5GR6ERMwYXUjE0z1olEoF1wakZC/Q= -github.com/openziti/sdk-golang v0.23.0 h1:0Sn/DSw206mMMSSWlWNKGKSxCvfT1FVWSKfCVQR/6wQ= -github.com/openziti/sdk-golang v0.23.0/go.mod h1:EH3CwCHoDgDrQh5GR6ERMwYXUjE0z1olEoF1wakZC/Q= +github.com/openziti/sdk-golang v0.23.3 h1:LujHMOcGoY7qeT4mtcJhzklEG2f192islXjT/jY0oQ4= +github.com/openziti/sdk-golang v0.23.3/go.mod h1:2yXIT3b6iWVyCChwuavaJHhlHozrxoM2IB3bybbVX4M= github.com/openziti/secretstream v0.1.16 h1:tVanF7OpJL1MJ1gvWaRlR2i+kAbrGsxr3q6EXFOS08U= github.com/openziti/secretstream v0.1.16/go.mod h1:bvjGBUW/0e5MzD5S3FW3rhGASRNWAi+kTkTENZ9qRDE= github.com/openziti/storage v0.2.30 h1:15o8rSSgtcNCSBONt81ZRASQXJHh2L9Y0aWcHoQ81dE= @@ -650,8 +620,6 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b h1:0LFwY6Q3gMACTjAbMZBjXAqTOzOwFaj2Ld6cjeQ7Rig= -github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -706,8 +674,6 @@ github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6g github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shirou/gopsutil/v3 v3.24.1 h1:R3t6ondCEvmARp3wxODhXMTLC/klMa87h2PHUw5m7QI= -github.com/shirou/gopsutil/v3 v3.24.1/go.mod h1:UU7a2MSBQa+kW1uuDq8DeEBS8kmrnQwsv2b5O513rwU= github.com/shirou/gopsutil/v3 v3.24.2 h1:kcR0erMbLg5/3LcInpw0X/rrPSqq4CDPyI6A6ZRC18Y= github.com/shirou/gopsutil/v3 v3.24.2/go.mod h1:tSg/594BcA+8UdQU2XcW803GWYgdtauFFPgJCJKZlVk= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= @@ -781,9 +747,8 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.1 h1:4VhoImhV/Bm0ToFkXFi8hXNXwpDRZ/ynw3amt82mzq0= -github.com/stretchr/objx v0.5.1/go.mod h1:/iHQpkQwBD6DLUmQ4pE+s1TXdob1mORJ4/UFdrifcy0= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -794,7 +759,6 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= @@ -804,11 +768,9 @@ github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSW github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/teris-io/shortid v0.0.0-20201117134242-e59966efd125 h1:3SNcvBmEPE1YlB1JpVZouslJpI3GBNoiqW7+wb0Rz7w= github.com/teris-io/shortid v0.0.0-20201117134242-e59966efd125/go.mod h1:M8agBzgqHIhgj7wEn9/0hJUZcrvt9VY+Ln+S1I5Mha0= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= @@ -835,8 +797,6 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= -github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zitadel/oidc/v2 v2.12.0 h1:4aMTAy99/4pqNwrawEyJqhRb3yY3PtcDxnoDSryhpn4= @@ -859,18 +819,12 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/otel v1.23.1 h1:Za4UzOqJYS+MUczKI320AtqZHZb7EqxO00jAHE0jmQY= -go.opentelemetry.io/otel v1.23.1/go.mod h1:Td0134eafDLcTS4y+zQ26GE8u3dEuRBiBCTUIRHaikA= go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.23.1 h1:PQJmqJ9u2QaJLBOELl1cxIdPcpbwzbkjfEyelTl2rlo= -go.opentelemetry.io/otel/metric v1.23.1/go.mod h1:mpG2QPlAfnK8yNhNJAxDZruU9Y1/HubbC+KyH8FaCWI= go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.17.0 h1:FLN2X66Ke/k5Sg3V623Q7h7nt3cHXaW1FOvKKrW0IpE= -go.opentelemetry.io/otel/sdk v1.17.0/go.mod h1:U87sE0f5vQB7hwUoW98pW5Rz4ZDuCFBZFNUBlSgmDFQ= -go.opentelemetry.io/otel/trace v1.23.1 h1:4LrmmEd8AU2rFvU1zegmvqW7+kWarxtNOPyeL6HmYY8= -go.opentelemetry.io/otel/trace v1.23.1/go.mod h1:4IpnpJFwr1mo/6HL8XIPJaE9y0+u1KcVmuW7dwFSVrI= +go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= +go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -909,8 +863,6 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -923,8 +875,6 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= @@ -959,8 +909,7 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1014,8 +963,6 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1032,8 +979,6 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= -golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= @@ -1131,8 +1076,6 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= @@ -1142,8 +1085,6 @@ golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1225,8 +1166,7 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= -golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1348,8 +1288,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/AlecAivazis/survey.v1 v1.8.7 h1:oBJqtgsyBLg9K5FK9twNUbcPnbCPoh+R9a+7nag3qJM= gopkg.in/AlecAivazis/survey.v1 v1.8.7/go.mod h1:iBNOmqKz/NUbZx3bA+4hAGLRC7fSK7tgtVDT4tB22XA= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= diff --git a/tests/ats-ctrl.yml b/tests/ats-ctrl.yml index e5fcca7b3..2df914868 100644 --- a/tests/ats-ctrl.yml +++ b/tests/ats-ctrl.yml @@ -57,7 +57,6 @@ web: - binding: edge-client - binding: edge-oidc options: - secret: "12312412421129102" redirectURIs: - "http://localhost:*/auth/callback" - "http://127.0.0.1:*/auth/callback" From 9cfc8e07fca1cc4e7e7d83df9d0ae3334333bb30 Mon Sep 17 00:00:00 2001 From: Andrew Martinez Date: Tue, 12 Mar 2024 09:45:55 -0400 Subject: [PATCH 13/29] update sdk/edge-api deps --- controller/model/api_session_manager.go | 1 + go.mod | 16 ++++++------- go.sum | 32 ++++++++++++------------- zititest/go.mod | 28 +++++++++++----------- zititest/go.sum | 14 +++++++++++ 5 files changed, 53 insertions(+), 38 deletions(-) diff --git a/controller/model/api_session_manager.go b/controller/model/api_session_manager.go index 747f49a6b..642066bb0 100644 --- a/controller/model/api_session_manager.go +++ b/controller/model/api_session_manager.go @@ -124,6 +124,7 @@ func (self *ApiSessionManager) UpdateWithFieldChecker(apiSession *ApiSession, fi func (self *ApiSessionManager) MfaCompleted(apiSession *ApiSession, ctx *change.Context) error { apiSession.MfaComplete = true + return self.updateEntity(apiSession, &OrFieldChecker{NewFieldChecker(db.FieldApiSessionMfaComplete), self}, ctx.NewMutateContext()) } diff --git a/go.mod b/go.mod index eec3011c0..45e3722d2 100644 --- a/go.mod +++ b/go.mod @@ -48,17 +48,17 @@ require ( github.com/mitchellh/mapstructure v1.5.0 github.com/natefinch/lumberjack v2.0.0+incompatible github.com/openziti/agent v1.0.16 - github.com/openziti/channel/v2 v2.0.119 - github.com/openziti/edge-api v0.26.12 - github.com/openziti/foundation/v2 v2.0.37 - github.com/openziti/identity v1.0.70 + github.com/openziti/channel/v2 v2.0.121 + github.com/openziti/edge-api v0.26.13 + github.com/openziti/foundation/v2 v2.0.39 + github.com/openziti/identity v1.0.72 github.com/openziti/jwks v1.0.3 - github.com/openziti/metrics v1.2.45 + github.com/openziti/metrics v1.2.47 github.com/openziti/runzmd v1.0.38 - github.com/openziti/sdk-golang v0.23.3 - github.com/openziti/secretstream v0.1.16 + github.com/openziti/sdk-golang v0.23.10 + github.com/openziti/secretstream v0.1.17 github.com/openziti/storage v0.2.30 - github.com/openziti/transport/v2 v2.0.122 + github.com/openziti/transport/v2 v2.0.124 github.com/openziti/x509-claims v1.0.3 github.com/openziti/xweb/v2 v2.1.0 github.com/openziti/ziti-db-explorer v1.1.3 diff --git a/go.sum b/go.sum index f0e9b31e8..67289548c 100644 --- a/go.sum +++ b/go.sum @@ -566,30 +566,30 @@ github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYr github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/openziti/agent v1.0.16 h1:9Saji+8hFE1NpzP2XzDhsVJbCrDlhixoLHfOpFt5Z+U= github.com/openziti/agent v1.0.16/go.mod h1:zfm53+PVWoGFzjGGgQdKby5749G6VRYHe+eQJmoVKy4= -github.com/openziti/channel/v2 v2.0.119 h1:stfSrnDqoTi78LMvQA3+NSivHjQnRrYKrgij5NaOENI= -github.com/openziti/channel/v2 v2.0.119/go.mod h1:lSRJwqmbkE34DgXYEmUhVCzwcQcx65vZGE8nuBNK458= +github.com/openziti/channel/v2 v2.0.121 h1:dCPNbn0VbGIOrzXHcnjp5p0XzZCbpHKRmMhi9LRex0E= +github.com/openziti/channel/v2 v2.0.121/go.mod h1:f/DLqWVAFF5pDIpse8BRm4ZwhpAFjx0gUGjPEqlPSZE= github.com/openziti/dilithium v0.3.3 h1:PLgQ6PMNLSTzCFbX/h98cmudgz/cU6TmjdSv5NAPD8k= github.com/openziti/dilithium v0.3.3/go.mod h1:vsCjI2AU/hon9e+dLhUFbCNGesJDj2ASgkySOcpmvjo= -github.com/openziti/edge-api v0.26.12 h1:5VRz0cWtfQq2rhSA7Ne6amM7YNI6pQGRfNgbKt0g6kQ= -github.com/openziti/edge-api v0.26.12/go.mod h1:tKZRUFDB9zM5J1zBS0ok2r40OhJqWykZaU9HSBQgr8w= -github.com/openziti/foundation/v2 v2.0.37 h1:7pa4vWrlwllEoLXaK2rx91AffLQJ8k5pvc92oWANavA= -github.com/openziti/foundation/v2 v2.0.37/go.mod h1:2NxzCnJbMw35U9RrFcdEaiXdxIMfBHOUNPngpyhvKeY= -github.com/openziti/identity v1.0.70 h1:JNwtJHmIS0DcXookm2xuXyh4z92T1O21GQvuO8PmHWs= -github.com/openziti/identity v1.0.70/go.mod h1:jsKBL4G1BsmDSCIfhK4jha5B3Sevgy1jyZq0GtFKhSk= +github.com/openziti/edge-api v0.26.13 h1:lWAHu04nk7a0AEnJBjmwijUIEE+NvNAiOcdg11dxbIY= +github.com/openziti/edge-api v0.26.13/go.mod h1:aTRqB9J/6ISbw9+YWjzD0tvWAXY98m8yWcbiGNqAQTU= +github.com/openziti/foundation/v2 v2.0.39 h1:psv1cTgBErOME4K5TmxolUzz8VabJVhGygsAz6uXAQM= +github.com/openziti/foundation/v2 v2.0.39/go.mod h1:38RikdtjvzDUALm3jT3PSOrU0bHCleRty6bHGdfFyUI= +github.com/openziti/identity v1.0.72 h1:Y14nUtgDiUBWZ6WBo6S1rw5qb57QNnZGhsFnMPqfJB8= +github.com/openziti/identity v1.0.72/go.mod h1:sh1STe6K3EM3K0atBVDLq5jpUxAAFCAQZmIkD0MYIKY= github.com/openziti/jwks v1.0.3 h1:hf8wkb+Cg4nH/HM0KROFd7u+C3DkRVcFZJ7tDV+4icc= github.com/openziti/jwks v1.0.3/go.mod h1:t4xxq8vlXGsPn29kiQVnZBBDDnEoOFqtJoHibkJunQQ= -github.com/openziti/metrics v1.2.45 h1:+3zqszLWyFdTgzbsQD90V0yJcC9Ek77qKaIGMQXkAXs= -github.com/openziti/metrics v1.2.45/go.mod h1:g6CgAEbFes2UtdfGrsR8AKkuoBVL5dkU61843uQvllM= +github.com/openziti/metrics v1.2.47 h1:hIp1xnqLxNc7O0yTHIp65REhYBXj7QWeOiayGDzjRrw= +github.com/openziti/metrics v1.2.47/go.mod h1:pHj/z3HCls4/+dLoQKTURNTnHmwUbjZFZOGzj2X6HeI= github.com/openziti/runzmd v1.0.38 h1:0eFWAf7R9Thx99ue7Gql2dBavsqv4jldU8W5AIZJ8wo= github.com/openziti/runzmd v1.0.38/go.mod h1:WiQi+YIXxZBH1bwjr+eo/e3ftfTLEABpN0i2QIhBI9w= -github.com/openziti/sdk-golang v0.23.3 h1:LujHMOcGoY7qeT4mtcJhzklEG2f192islXjT/jY0oQ4= -github.com/openziti/sdk-golang v0.23.3/go.mod h1:2yXIT3b6iWVyCChwuavaJHhlHozrxoM2IB3bybbVX4M= -github.com/openziti/secretstream v0.1.16 h1:tVanF7OpJL1MJ1gvWaRlR2i+kAbrGsxr3q6EXFOS08U= -github.com/openziti/secretstream v0.1.16/go.mod h1:bvjGBUW/0e5MzD5S3FW3rhGASRNWAi+kTkTENZ9qRDE= +github.com/openziti/sdk-golang v0.23.10 h1:ygpOt99Rd5ESoH1ExYqBHhZp47s5/DYxyfgTO6uYr7Q= +github.com/openziti/sdk-golang v0.23.10/go.mod h1:07G4gYyZzRt9fb3uxEhwdsgJwDrqEkjuvVnnRlsrfEc= +github.com/openziti/secretstream v0.1.17 h1:bcaPGGpUl0+3GzfQkshKh5slUE7QDXxFq3vyDQgHkCA= +github.com/openziti/secretstream v0.1.17/go.mod h1:gosi8ohW+dAHhz1h/MjZEcEVWO0jisWqWjEjmx7oAEs= github.com/openziti/storage v0.2.30 h1:15o8rSSgtcNCSBONt81ZRASQXJHh2L9Y0aWcHoQ81dE= github.com/openziti/storage v0.2.30/go.mod h1:ltsgk2G0c3jVZVTK5bHkRtblGdFFoSJ3fOMur/0iFKg= -github.com/openziti/transport/v2 v2.0.122 h1:XWwZ6JcSO1nvbZgfp6kdf8aR5LEEN343mpZlhSihirk= -github.com/openziti/transport/v2 v2.0.122/go.mod h1:07Ak2jMsyZmi7/ECxGNfMXk8cF1Vj5qtKj90FoAnK8A= +github.com/openziti/transport/v2 v2.0.124 h1:84bq7vyqzGJXPek9qyc/7mtVEhp6KTQMK2msq3hwGkY= +github.com/openziti/transport/v2 v2.0.124/go.mod h1:eQ3011tfSlmBI3cIkcJOf9YP/afj+Jd2EQM6MCHoJCQ= github.com/openziti/x509-claims v1.0.3 h1:HNdQ8Nf1agB3lBs1gahcO6zfkeS4S5xoQ2/PkY4HRX0= github.com/openziti/x509-claims v1.0.3/go.mod h1:Z0WIpBm6c4ecrpRKrou6Gk2wrLWxJO/+tuUwKh8VewE= github.com/openziti/xweb/v2 v2.1.0 h1:Xhh3C2pZkq/Prr65V+SfFSibLDYteoc4f62KQCcTZF4= diff --git a/zititest/go.mod b/zititest/go.mod index 5b1d8e276..f23b00415 100644 --- a/zititest/go.mod +++ b/zititest/go.mod @@ -7,18 +7,18 @@ replace github.com/openziti/ziti => ../ require ( github.com/Jeffail/gabs v1.4.0 github.com/Jeffail/gabs/v2 v2.7.0 - github.com/go-openapi/runtime v0.27.2 + github.com/go-openapi/runtime v0.28.0 github.com/google/go-cmp v0.6.0 github.com/google/uuid v1.6.0 github.com/gorilla/websocket v1.5.1 github.com/michaelquigley/pfxlog v0.6.10 github.com/openziti/agent v1.0.16 github.com/openziti/channel/v2 v2.0.119 - github.com/openziti/edge-api v0.26.11 + github.com/openziti/edge-api v0.26.12 github.com/openziti/fablab v0.5.42 github.com/openziti/foundation/v2 v2.0.37 github.com/openziti/identity v1.0.70 - github.com/openziti/sdk-golang v0.23.0 + github.com/openziti/sdk-golang v0.23.3 github.com/openziti/storage v0.2.30 github.com/openziti/transport/v2 v2.0.122 github.com/openziti/ziti v0.28.3 @@ -29,7 +29,7 @@ require ( github.com/stretchr/testify v1.9.0 go.etcd.io/bbolt v1.3.8 golang.org/x/net v0.22.0 - google.golang.org/protobuf v1.32.0 + google.golang.org/protobuf v1.33.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -70,18 +70,18 @@ require ( github.com/go-logr/logr v1.4.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-openapi/analysis v0.22.3 // indirect - github.com/go-openapi/errors v0.21.1 // indirect - github.com/go-openapi/jsonpointer v0.20.3 // indirect - github.com/go-openapi/jsonreference v0.20.5 // indirect - github.com/go-openapi/loads v0.21.6 // indirect - github.com/go-openapi/spec v0.20.15 // indirect - github.com/go-openapi/strfmt v0.22.2 // indirect - github.com/go-openapi/swag v0.22.10 // indirect - github.com/go-openapi/validate v0.23.2 // indirect + github.com/go-openapi/analysis v0.23.0 // indirect + github.com/go-openapi/errors v0.22.0 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/loads v0.22.0 // indirect + github.com/go-openapi/spec v0.21.0 // indirect + github.com/go-openapi/strfmt v0.23.0 // indirect + github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-openapi/validate v0.24.0 // indirect github.com/go-resty/resty/v2 v2.11.0 // indirect github.com/golang-jwt/jwt/v5 v5.2.1 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/gomarkdown/markdown v0.0.0-20230922112808-5421fefb8386 // indirect github.com/gorilla/handlers v1.5.2 // indirect github.com/gorilla/mux v1.8.1 // indirect diff --git a/zititest/go.sum b/zititest/go.sum index daafb2c97..044dcdbf1 100644 --- a/zititest/go.sum +++ b/zititest/go.sum @@ -226,33 +226,43 @@ github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW github.com/go-openapi/analysis v0.22.2 h1:ZBmNoP2h5omLKr/srIC9bfqrUGzT6g6gNv03HE9Vpj0= github.com/go-openapi/analysis v0.22.2/go.mod h1:pDF4UbZsQTo/oNuRfAWWd4dAh4yuYf//LYorPTjrpvo= github.com/go-openapi/analysis v0.22.3/go.mod h1:y2vjQNdRVOg0gG88n7gBGKWm3yjNOlaTVkxBLHaNlts= +github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo= github.com/go-openapi/errors v0.21.0 h1:FhChC/duCnfoLj1gZ0BgaBmzhJC2SL/sJr8a2vAobSY= github.com/go-openapi/errors v0.21.0/go.mod h1:jxNTMUxRCKj65yb/okJGEtahVd7uvWnuWfj53bse4ho= github.com/go-openapi/errors v0.21.1/go.mod h1:LyiY9bgc7AVVh6wtVvMYEyoj3KJYNoRw92mmvnMWgj8= +github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE= github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= github.com/go-openapi/jsonpointer v0.20.3/go.mod h1:c7l0rjoouAuIxCm8v/JWKRgMjDG/+/7UBWsXMrv6PsM= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= github.com/go-openapi/jsonreference v0.20.5/go.mod h1:thAqAp31UABtI+FQGKAQfmv7DbFpKNUlva2UPCxKu2Y= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= github.com/go-openapi/loads v0.21.5 h1:jDzF4dSoHw6ZFADCGltDb2lE4F6De7aWSpe+IcsRzT0= github.com/go-openapi/loads v0.21.5/go.mod h1:PxTsnFBoBe+z89riT+wYt3prmSBP6GDAQh2l9H1Flz8= github.com/go-openapi/loads v0.21.6/go.mod h1:eEquguZx+S9eigxJ7QhrzfhW1Me47n54wlHX9RK8to4= +github.com/go-openapi/loads v0.22.0/go.mod h1:yLsaTCS92mnSAZX5WWoxszLj0u+Ojl+Zs5Stn1oF+rs= github.com/go-openapi/runtime v0.27.1 h1:ae53yaOoh+fx/X5Eaq8cRmavHgDma65XPZuvBqvJYto= github.com/go-openapi/runtime v0.27.1/go.mod h1:fijeJEiEclyS8BRurYE1DE5TLb9/KZl6eAdbzjsrlLU= github.com/go-openapi/runtime v0.27.2/go.mod h1:a5AkfzISU/Iwq51ZiQLM+oNRDwqC9RtlSt57xUSyZhg= +github.com/go-openapi/runtime v0.28.0/go.mod h1:QN7OzcS+XuYmkQLw05akXk0jRH/eZ3kb18+1KwW9gyc= github.com/go-openapi/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do= github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw= github.com/go-openapi/spec v0.20.15/go.mod h1:o0upgqg5uYFG7O5mADrDVmSG3Wa6y6OLhwiCqQ+sTv4= +github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= github.com/go-openapi/strfmt v0.22.0 h1:Ew9PnEYc246TwrEspvBdDHS4BVKXy/AOVsfqGDgAcaI= github.com/go-openapi/strfmt v0.22.0/go.mod h1:HzJ9kokGIju3/K6ap8jL+OlGAbjpSv27135Yr9OivU4= github.com/go-openapi/strfmt v0.22.2/go.mod h1:HB/b7TCm91rno75Dembc1dFW/0FPLk5CEXsoF9ReNc4= +github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4= github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE= github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE= github.com/go-openapi/swag v0.22.10/go.mod h1:Cnn8BYtRlx6BNE3DPN86f/xkapGIcLWzh3CLEb4C1jI= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-openapi/validate v0.23.0 h1:2l7PJLzCis4YUGEoW6eoQw3WhyM65WSIcjX6SQnlfDw= github.com/go-openapi/validate v0.23.0/go.mod h1:EeiAZ5bmpSIOJV1WLfyYF9qp/B1ZgSaEpHTJHtN5cbE= github.com/go-openapi/validate v0.23.2/go.mod h1:FencnMQqop3HPZk+wIkLsQHgOKP1EDAgF2LZDW7fWr8= +github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ= github.com/go-resty/resty/v2 v2.11.0 h1:i7jMfNOJYMp69lq7qozJP+bjgzfAzeOhuGlyDrqxT/8= github.com/go-resty/resty/v2 v2.11.0/go.mod h1:iiP/OpA0CkcL3IGt1O0+/SIItFUbkkyw5BGXiVdTu+A= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -299,6 +309,7 @@ github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/gomarkdown/markdown v0.0.0-20191123064959-2c17d62f5098/go.mod h1:aii0r/K0ZnHv7G0KF7xy1v0A7s2Ljrb5byB7MO5p6TU= github.com/gomarkdown/markdown v0.0.0-20230922112808-5421fefb8386 h1:EcQR3gusLHN46TAD+G+EbaaqJArt5vHhNpXAa12PQf4= @@ -606,6 +617,7 @@ github.com/openziti/dilithium v0.3.3 h1:PLgQ6PMNLSTzCFbX/h98cmudgz/cU6TmjdSv5NAP github.com/openziti/dilithium v0.3.3/go.mod h1:vsCjI2AU/hon9e+dLhUFbCNGesJDj2ASgkySOcpmvjo= github.com/openziti/edge-api v0.26.11 h1:qINsfGpPBTnbuDrOq+qcMZuBdlXosqvHX7sQhLA+cM4= github.com/openziti/edge-api v0.26.11/go.mod h1:30SiUmR+9gOBi9HUZgXLpCO2nNCbNFVx2jwXV2Dh4Og= +github.com/openziti/edge-api v0.26.12/go.mod h1:tKZRUFDB9zM5J1zBS0ok2r40OhJqWykZaU9HSBQgr8w= github.com/openziti/fablab v0.5.42 h1:vENJKfEba2T4sSLwlKDL/IzBYfY8iHnhc4umf6IESiY= github.com/openziti/fablab v0.5.42/go.mod h1:HDT06y1QX8kO8ZQrgHvZmJsvc8iRybESGtlDLDII4ks= github.com/openziti/foundation/v2 v2.0.37 h1:7pa4vWrlwllEoLXaK2rx91AffLQJ8k5pvc92oWANavA= @@ -622,6 +634,7 @@ github.com/openziti/sdk-golang v0.22.28 h1:s159CT42dXug4GiJiN/kM6/ol+N2LFZ2tUk6b github.com/openziti/sdk-golang v0.22.28/go.mod h1:BLaLvcLqAgf3JFoDPWLTj3j3X5rndo6ZejdDdkMlihQ= github.com/openziti/sdk-golang v0.22.31/go.mod h1:EH3CwCHoDgDrQh5GR6ERMwYXUjE0z1olEoF1wakZC/Q= github.com/openziti/sdk-golang v0.23.0/go.mod h1:EH3CwCHoDgDrQh5GR6ERMwYXUjE0z1olEoF1wakZC/Q= +github.com/openziti/sdk-golang v0.23.3/go.mod h1:2yXIT3b6iWVyCChwuavaJHhlHozrxoM2IB3bybbVX4M= github.com/openziti/secretstream v0.1.16 h1:tVanF7OpJL1MJ1gvWaRlR2i+kAbrGsxr3q6EXFOS08U= github.com/openziti/secretstream v0.1.16/go.mod h1:bvjGBUW/0e5MzD5S3FW3rhGASRNWAi+kTkTENZ9qRDE= github.com/openziti/storage v0.2.30 h1:15o8rSSgtcNCSBONt81ZRASQXJHh2L9Y0aWcHoQ81dE= @@ -1345,6 +1358,7 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/AlecAivazis/survey.v1 v1.8.7 h1:oBJqtgsyBLg9K5FK9twNUbcPnbCPoh+R9a+7nag3qJM= gopkg.in/AlecAivazis/survey.v1 v1.8.7/go.mod h1:iBNOmqKz/NUbZx3bA+4hAGLRC7fSK7tgtVDT4tB22XA= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= From 98354750087799422a634d34ccbd02325edb9eba Mon Sep 17 00:00:00 2001 From: Andrew Martinez Date: Tue, 12 Mar 2024 09:52:19 -0400 Subject: [PATCH 14/29] zititest go mod tidy --- zititest/go.mod | 16 ++--- zititest/go.sum | 152 ++++++++++++++++++------------------------------ 2 files changed, 63 insertions(+), 105 deletions(-) diff --git a/zititest/go.mod b/zititest/go.mod index f23b00415..e53cfca1a 100644 --- a/zititest/go.mod +++ b/zititest/go.mod @@ -13,14 +13,14 @@ require ( github.com/gorilla/websocket v1.5.1 github.com/michaelquigley/pfxlog v0.6.10 github.com/openziti/agent v1.0.16 - github.com/openziti/channel/v2 v2.0.119 - github.com/openziti/edge-api v0.26.12 + github.com/openziti/channel/v2 v2.0.121 + github.com/openziti/edge-api v0.26.13 github.com/openziti/fablab v0.5.42 - github.com/openziti/foundation/v2 v2.0.37 - github.com/openziti/identity v1.0.70 - github.com/openziti/sdk-golang v0.23.3 + github.com/openziti/foundation/v2 v2.0.39 + github.com/openziti/identity v1.0.72 + github.com/openziti/sdk-golang v0.23.10 github.com/openziti/storage v0.2.30 - github.com/openziti/transport/v2 v2.0.122 + github.com/openziti/transport/v2 v2.0.124 github.com/openziti/ziti v0.28.3 github.com/pkg/errors v0.9.1 github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 @@ -137,9 +137,9 @@ require ( github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/openziti/dilithium v0.3.3 // indirect github.com/openziti/jwks v1.0.3 // indirect - github.com/openziti/metrics v1.2.45 // indirect + github.com/openziti/metrics v1.2.47 // indirect github.com/openziti/runzmd v1.0.38 // indirect - github.com/openziti/secretstream v0.1.16 // indirect + github.com/openziti/secretstream v0.1.17 // indirect github.com/openziti/x509-claims v1.0.3 // indirect github.com/openziti/xweb/v2 v2.1.0 // indirect github.com/openziti/ziti-db-explorer v1.1.3 // indirect diff --git a/zititest/go.sum b/zititest/go.sum index 044dcdbf1..5efd957fd 100644 --- a/zititest/go.sum +++ b/zititest/go.sum @@ -223,45 +223,25 @@ github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-openapi/analysis v0.22.2 h1:ZBmNoP2h5omLKr/srIC9bfqrUGzT6g6gNv03HE9Vpj0= -github.com/go-openapi/analysis v0.22.2/go.mod h1:pDF4UbZsQTo/oNuRfAWWd4dAh4yuYf//LYorPTjrpvo= -github.com/go-openapi/analysis v0.22.3/go.mod h1:y2vjQNdRVOg0gG88n7gBGKWm3yjNOlaTVkxBLHaNlts= +github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU= github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo= -github.com/go-openapi/errors v0.21.0 h1:FhChC/duCnfoLj1gZ0BgaBmzhJC2SL/sJr8a2vAobSY= -github.com/go-openapi/errors v0.21.0/go.mod h1:jxNTMUxRCKj65yb/okJGEtahVd7uvWnuWfj53bse4ho= -github.com/go-openapi/errors v0.21.1/go.mod h1:LyiY9bgc7AVVh6wtVvMYEyoj3KJYNoRw92mmvnMWgj8= +github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w= github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE= -github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= -github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= -github.com/go-openapi/jsonpointer v0.20.3/go.mod h1:c7l0rjoouAuIxCm8v/JWKRgMjDG/+/7UBWsXMrv6PsM= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= -github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= -github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= -github.com/go-openapi/jsonreference v0.20.5/go.mod h1:thAqAp31UABtI+FQGKAQfmv7DbFpKNUlva2UPCxKu2Y= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= -github.com/go-openapi/loads v0.21.5 h1:jDzF4dSoHw6ZFADCGltDb2lE4F6De7aWSpe+IcsRzT0= -github.com/go-openapi/loads v0.21.5/go.mod h1:PxTsnFBoBe+z89riT+wYt3prmSBP6GDAQh2l9H1Flz8= -github.com/go-openapi/loads v0.21.6/go.mod h1:eEquguZx+S9eigxJ7QhrzfhW1Me47n54wlHX9RK8to4= +github.com/go-openapi/loads v0.22.0 h1:ECPGd4jX1U6NApCGG1We+uEozOAvXvJSF4nnwHZ8Aco= github.com/go-openapi/loads v0.22.0/go.mod h1:yLsaTCS92mnSAZX5WWoxszLj0u+Ojl+Zs5Stn1oF+rs= -github.com/go-openapi/runtime v0.27.1 h1:ae53yaOoh+fx/X5Eaq8cRmavHgDma65XPZuvBqvJYto= -github.com/go-openapi/runtime v0.27.1/go.mod h1:fijeJEiEclyS8BRurYE1DE5TLb9/KZl6eAdbzjsrlLU= -github.com/go-openapi/runtime v0.27.2/go.mod h1:a5AkfzISU/Iwq51ZiQLM+oNRDwqC9RtlSt57xUSyZhg= +github.com/go-openapi/runtime v0.28.0 h1:gpPPmWSNGo214l6n8hzdXYhPuJcGtziTOgUpvsFWGIQ= github.com/go-openapi/runtime v0.28.0/go.mod h1:QN7OzcS+XuYmkQLw05akXk0jRH/eZ3kb18+1KwW9gyc= -github.com/go-openapi/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do= -github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw= -github.com/go-openapi/spec v0.20.15/go.mod h1:o0upgqg5uYFG7O5mADrDVmSG3Wa6y6OLhwiCqQ+sTv4= +github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= -github.com/go-openapi/strfmt v0.22.0 h1:Ew9PnEYc246TwrEspvBdDHS4BVKXy/AOVsfqGDgAcaI= -github.com/go-openapi/strfmt v0.22.0/go.mod h1:HzJ9kokGIju3/K6ap8jL+OlGAbjpSv27135Yr9OivU4= -github.com/go-openapi/strfmt v0.22.2/go.mod h1:HB/b7TCm91rno75Dembc1dFW/0FPLk5CEXsoF9ReNc4= +github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c= github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4= -github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE= -github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE= -github.com/go-openapi/swag v0.22.10/go.mod h1:Cnn8BYtRlx6BNE3DPN86f/xkapGIcLWzh3CLEb4C1jI= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= -github.com/go-openapi/validate v0.23.0 h1:2l7PJLzCis4YUGEoW6eoQw3WhyM65WSIcjX6SQnlfDw= -github.com/go-openapi/validate v0.23.0/go.mod h1:EeiAZ5bmpSIOJV1WLfyYF9qp/B1ZgSaEpHTJHtN5cbE= -github.com/go-openapi/validate v0.23.2/go.mod h1:FencnMQqop3HPZk+wIkLsQHgOKP1EDAgF2LZDW7fWr8= +github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58= github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ= github.com/go-resty/resty/v2 v2.11.0 h1:i7jMfNOJYMp69lq7qozJP+bjgzfAzeOhuGlyDrqxT/8= github.com/go-resty/resty/v2 v2.11.0/go.mod h1:iiP/OpA0CkcL3IGt1O0+/SIItFUbkkyw5BGXiVdTu+A= @@ -270,8 +250,7 @@ github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= -github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -307,8 +286,7 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/gomarkdown/markdown v0.0.0-20191123064959-2c17d62f5098/go.mod h1:aii0r/K0ZnHv7G0KF7xy1v0A7s2Ljrb5byB7MO5p6TU= @@ -334,6 +312,8 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -361,11 +341,9 @@ github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyE github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/schema v1.2.0 h1:YufUaxZYCKGFuAq3c96BOhjgd5nmXiOY9NGzF247Tsc= -github.com/gorilla/schema v1.2.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= +github.com/gorilla/schema v1.2.1 h1:tjDxcmdb+siIqkTNoV+qRH2mjYdr2hHe5MKXbp61ziM= github.com/gorilla/schema v1.2.1/go.mod h1:Dg5SSm5PV60mhF2NFaTV1xuYYj8tV8NOPRo4FggUMnM= -github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= @@ -494,8 +472,7 @@ github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i github.com/lucsky/cuid v1.2.1 h1:MtJrL2OFhvYufUIn48d35QGXyeTC8tn0upumW9WwTHg= github.com/lucsky/cuid v1.2.1/go.mod h1:QaaJqckboimOmhRSJXSx/+IT+VTfxfPGSo/6mfgUfmE= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed h1:036IscGBfJsFIgJQzlui7nK1Ncm0tp2ktmPj8xO4N/0= -github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= +github.com/lufia/plan9stats v0.0.0-20240226150601-1dcf7310316a h1:3Bm7EwfUQUvhNeKIkUct/gl9eod1TcXuj8stxvi/GoI= github.com/lufia/plan9stats v0.0.0-20240226150601-1dcf7310316a/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -611,36 +588,32 @@ github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYr github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/openziti/agent v1.0.16 h1:9Saji+8hFE1NpzP2XzDhsVJbCrDlhixoLHfOpFt5Z+U= github.com/openziti/agent v1.0.16/go.mod h1:zfm53+PVWoGFzjGGgQdKby5749G6VRYHe+eQJmoVKy4= -github.com/openziti/channel/v2 v2.0.119 h1:stfSrnDqoTi78LMvQA3+NSivHjQnRrYKrgij5NaOENI= -github.com/openziti/channel/v2 v2.0.119/go.mod h1:lSRJwqmbkE34DgXYEmUhVCzwcQcx65vZGE8nuBNK458= +github.com/openziti/channel/v2 v2.0.121 h1:dCPNbn0VbGIOrzXHcnjp5p0XzZCbpHKRmMhi9LRex0E= +github.com/openziti/channel/v2 v2.0.121/go.mod h1:f/DLqWVAFF5pDIpse8BRm4ZwhpAFjx0gUGjPEqlPSZE= github.com/openziti/dilithium v0.3.3 h1:PLgQ6PMNLSTzCFbX/h98cmudgz/cU6TmjdSv5NAPD8k= github.com/openziti/dilithium v0.3.3/go.mod h1:vsCjI2AU/hon9e+dLhUFbCNGesJDj2ASgkySOcpmvjo= -github.com/openziti/edge-api v0.26.11 h1:qINsfGpPBTnbuDrOq+qcMZuBdlXosqvHX7sQhLA+cM4= -github.com/openziti/edge-api v0.26.11/go.mod h1:30SiUmR+9gOBi9HUZgXLpCO2nNCbNFVx2jwXV2Dh4Og= -github.com/openziti/edge-api v0.26.12/go.mod h1:tKZRUFDB9zM5J1zBS0ok2r40OhJqWykZaU9HSBQgr8w= +github.com/openziti/edge-api v0.26.13 h1:lWAHu04nk7a0AEnJBjmwijUIEE+NvNAiOcdg11dxbIY= +github.com/openziti/edge-api v0.26.13/go.mod h1:aTRqB9J/6ISbw9+YWjzD0tvWAXY98m8yWcbiGNqAQTU= github.com/openziti/fablab v0.5.42 h1:vENJKfEba2T4sSLwlKDL/IzBYfY8iHnhc4umf6IESiY= github.com/openziti/fablab v0.5.42/go.mod h1:HDT06y1QX8kO8ZQrgHvZmJsvc8iRybESGtlDLDII4ks= -github.com/openziti/foundation/v2 v2.0.37 h1:7pa4vWrlwllEoLXaK2rx91AffLQJ8k5pvc92oWANavA= -github.com/openziti/foundation/v2 v2.0.37/go.mod h1:2NxzCnJbMw35U9RrFcdEaiXdxIMfBHOUNPngpyhvKeY= -github.com/openziti/identity v1.0.70 h1:JNwtJHmIS0DcXookm2xuXyh4z92T1O21GQvuO8PmHWs= -github.com/openziti/identity v1.0.70/go.mod h1:jsKBL4G1BsmDSCIfhK4jha5B3Sevgy1jyZq0GtFKhSk= +github.com/openziti/foundation/v2 v2.0.39 h1:psv1cTgBErOME4K5TmxolUzz8VabJVhGygsAz6uXAQM= +github.com/openziti/foundation/v2 v2.0.39/go.mod h1:38RikdtjvzDUALm3jT3PSOrU0bHCleRty6bHGdfFyUI= +github.com/openziti/identity v1.0.72 h1:Y14nUtgDiUBWZ6WBo6S1rw5qb57QNnZGhsFnMPqfJB8= +github.com/openziti/identity v1.0.72/go.mod h1:sh1STe6K3EM3K0atBVDLq5jpUxAAFCAQZmIkD0MYIKY= github.com/openziti/jwks v1.0.3 h1:hf8wkb+Cg4nH/HM0KROFd7u+C3DkRVcFZJ7tDV+4icc= github.com/openziti/jwks v1.0.3/go.mod h1:t4xxq8vlXGsPn29kiQVnZBBDDnEoOFqtJoHibkJunQQ= -github.com/openziti/metrics v1.2.45 h1:+3zqszLWyFdTgzbsQD90V0yJcC9Ek77qKaIGMQXkAXs= -github.com/openziti/metrics v1.2.45/go.mod h1:g6CgAEbFes2UtdfGrsR8AKkuoBVL5dkU61843uQvllM= +github.com/openziti/metrics v1.2.47 h1:hIp1xnqLxNc7O0yTHIp65REhYBXj7QWeOiayGDzjRrw= +github.com/openziti/metrics v1.2.47/go.mod h1:pHj/z3HCls4/+dLoQKTURNTnHmwUbjZFZOGzj2X6HeI= github.com/openziti/runzmd v1.0.38 h1:0eFWAf7R9Thx99ue7Gql2dBavsqv4jldU8W5AIZJ8wo= github.com/openziti/runzmd v1.0.38/go.mod h1:WiQi+YIXxZBH1bwjr+eo/e3ftfTLEABpN0i2QIhBI9w= -github.com/openziti/sdk-golang v0.22.28 h1:s159CT42dXug4GiJiN/kM6/ol+N2LFZ2tUk6bOpbgiI= -github.com/openziti/sdk-golang v0.22.28/go.mod h1:BLaLvcLqAgf3JFoDPWLTj3j3X5rndo6ZejdDdkMlihQ= -github.com/openziti/sdk-golang v0.22.31/go.mod h1:EH3CwCHoDgDrQh5GR6ERMwYXUjE0z1olEoF1wakZC/Q= -github.com/openziti/sdk-golang v0.23.0/go.mod h1:EH3CwCHoDgDrQh5GR6ERMwYXUjE0z1olEoF1wakZC/Q= -github.com/openziti/sdk-golang v0.23.3/go.mod h1:2yXIT3b6iWVyCChwuavaJHhlHozrxoM2IB3bybbVX4M= -github.com/openziti/secretstream v0.1.16 h1:tVanF7OpJL1MJ1gvWaRlR2i+kAbrGsxr3q6EXFOS08U= -github.com/openziti/secretstream v0.1.16/go.mod h1:bvjGBUW/0e5MzD5S3FW3rhGASRNWAi+kTkTENZ9qRDE= +github.com/openziti/sdk-golang v0.23.10 h1:ygpOt99Rd5ESoH1ExYqBHhZp47s5/DYxyfgTO6uYr7Q= +github.com/openziti/sdk-golang v0.23.10/go.mod h1:07G4gYyZzRt9fb3uxEhwdsgJwDrqEkjuvVnnRlsrfEc= +github.com/openziti/secretstream v0.1.17 h1:bcaPGGpUl0+3GzfQkshKh5slUE7QDXxFq3vyDQgHkCA= +github.com/openziti/secretstream v0.1.17/go.mod h1:gosi8ohW+dAHhz1h/MjZEcEVWO0jisWqWjEjmx7oAEs= github.com/openziti/storage v0.2.30 h1:15o8rSSgtcNCSBONt81ZRASQXJHh2L9Y0aWcHoQ81dE= github.com/openziti/storage v0.2.30/go.mod h1:ltsgk2G0c3jVZVTK5bHkRtblGdFFoSJ3fOMur/0iFKg= -github.com/openziti/transport/v2 v2.0.122 h1:XWwZ6JcSO1nvbZgfp6kdf8aR5LEEN343mpZlhSihirk= -github.com/openziti/transport/v2 v2.0.122/go.mod h1:07Ak2jMsyZmi7/ECxGNfMXk8cF1Vj5qtKj90FoAnK8A= +github.com/openziti/transport/v2 v2.0.124 h1:84bq7vyqzGJXPek9qyc/7mtVEhp6KTQMK2msq3hwGkY= +github.com/openziti/transport/v2 v2.0.124/go.mod h1:eQ3011tfSlmBI3cIkcJOf9YP/afj+Jd2EQM6MCHoJCQ= github.com/openziti/x509-claims v1.0.3 h1:HNdQ8Nf1agB3lBs1gahcO6zfkeS4S5xoQ2/PkY4HRX0= github.com/openziti/x509-claims v1.0.3/go.mod h1:Z0WIpBm6c4ecrpRKrou6Gk2wrLWxJO/+tuUwKh8VewE= github.com/openziti/xweb/v2 v2.1.0 h1:Xhh3C2pZkq/Prr65V+SfFSibLDYteoc4f62KQCcTZF4= @@ -673,8 +646,7 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b h1:0LFwY6Q3gMACTjAbMZBjXAqTOzOwFaj2Ld6cjeQ7Rig= -github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -728,8 +700,7 @@ github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6g github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shirou/gopsutil/v3 v3.24.1 h1:R3t6ondCEvmARp3wxODhXMTLC/klMa87h2PHUw5m7QI= -github.com/shirou/gopsutil/v3 v3.24.1/go.mod h1:UU7a2MSBQa+kW1uuDq8DeEBS8kmrnQwsv2b5O513rwU= +github.com/shirou/gopsutil/v3 v3.24.2 h1:kcR0erMbLg5/3LcInpw0X/rrPSqq4CDPyI6A6ZRC18Y= github.com/shirou/gopsutil/v3 v3.24.2/go.mod h1:tSg/594BcA+8UdQU2XcW803GWYgdtauFFPgJCJKZlVk= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= @@ -803,8 +774,8 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.1 h1:4VhoImhV/Bm0ToFkXFi8hXNXwpDRZ/ynw3amt82mzq0= -github.com/stretchr/objx v0.5.1/go.mod h1:/iHQpkQwBD6DLUmQ4pE+s1TXdob1mORJ4/UFdrifcy0= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -815,8 +786,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= @@ -824,11 +795,11 @@ github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSW github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/teris-io/shortid v0.0.0-20201117134242-e59966efd125 h1:3SNcvBmEPE1YlB1JpVZouslJpI3GBNoiqW7+wb0Rz7w= github.com/teris-io/shortid v0.0.0-20201117134242-e59966efd125/go.mod h1:M8agBzgqHIhgj7wEn9/0hJUZcrvt9VY+Ln+S1I5Mha0= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= @@ -853,8 +824,7 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= -github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zitadel/oidc/v2 v2.12.0 h1:4aMTAy99/4pqNwrawEyJqhRb3yY3PtcDxnoDSryhpn4= github.com/zitadel/oidc/v2 v2.12.0/go.mod h1:LrRav74IiThHGapQgCHZOUNtnqJG0tcZKHro/91rtLw= @@ -876,16 +846,13 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/otel v1.23.1 h1:Za4UzOqJYS+MUczKI320AtqZHZb7EqxO00jAHE0jmQY= -go.opentelemetry.io/otel v1.23.1/go.mod h1:Td0134eafDLcTS4y+zQ26GE8u3dEuRBiBCTUIRHaikA= +go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.23.1 h1:PQJmqJ9u2QaJLBOELl1cxIdPcpbwzbkjfEyelTl2rlo= -go.opentelemetry.io/otel/metric v1.23.1/go.mod h1:mpG2QPlAfnK8yNhNJAxDZruU9Y1/HubbC+KyH8FaCWI= +go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.17.0 h1:FLN2X66Ke/k5Sg3V623Q7h7nt3cHXaW1FOvKKrW0IpE= -go.opentelemetry.io/otel/sdk v1.17.0/go.mod h1:U87sE0f5vQB7hwUoW98pW5Rz4ZDuCFBZFNUBlSgmDFQ= -go.opentelemetry.io/otel/trace v1.23.1 h1:4LrmmEd8AU2rFvU1zegmvqW7+kWarxtNOPyeL6HmYY8= -go.opentelemetry.io/otel/trace v1.23.1/go.mod h1:4IpnpJFwr1mo/6HL8XIPJaE9y0+u1KcVmuW7dwFSVrI= +go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= +go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= +go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -923,8 +890,7 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -936,8 +902,7 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= +golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -971,8 +936,7 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1026,8 +990,7 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1043,8 +1006,7 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= -golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= +golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1141,9 +1103,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1151,8 +1112,7 @@ golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1233,8 +1193,7 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= -golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1356,8 +1315,7 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/AlecAivazis/survey.v1 v1.8.7 h1:oBJqtgsyBLg9K5FK9twNUbcPnbCPoh+R9a+7nag3qJM= gopkg.in/AlecAivazis/survey.v1 v1.8.7/go.mod h1:iBNOmqKz/NUbZx3bA+4hAGLRC7fSK7tgtVDT4tB22XA= From 7ab233fc741350b9d3c7975cc3dfbda073c566e7 Mon Sep 17 00:00:00 2001 From: Andrew Martinez Date: Thu, 14 Mar 2024 08:49:48 -0400 Subject: [PATCH 15/29] fix merge issues --- common/pb/edge_ctrl_pb/edge_ctrl.pb.go | 4367 +++++++++++++++--------- router/xgress_edge/listener.go | 10 +- 2 files changed, 2795 insertions(+), 1582 deletions(-) diff --git a/common/pb/edge_ctrl_pb/edge_ctrl.pb.go b/common/pb/edge_ctrl_pb/edge_ctrl.pb.go index b47cbaff0..c08aafc14 100644 --- a/common/pb/edge_ctrl_pb/edge_ctrl.pb.go +++ b/common/pb/edge_ctrl_pb/edge_ctrl.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.31.0 -// protoc v3.21.12 +// protoc v4.23.4 // source: edge_ctrl.proto package edge_ctrl_pb @@ -9,6 +9,7 @@ package edge_ctrl_pb import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" ) @@ -45,7 +46,6 @@ const ( ContentType_RemoveTerminatorResponseType ContentType = 20212 ContentType_ValidateSessionsRequestType ContentType = 20213 ContentType_HealthEventType ContentType = 20214 - ContentType_SigningCertAddedType ContentType = 20215 ContentType_CreateTerminatorV2RequestType ContentType = 20216 ContentType_CreateTerminatorV2ResponseType ContentType = 20217 ContentType_CreateCircuitV2RequestType ContentType = 20218 @@ -67,6 +67,9 @@ const ( ContentType_RemoveTunnelTerminatorRequestType ContentType = 20410 ContentType_RemoveTunnelTerminatorResponseType ContentType = 20411 ContentType_TunnelHealthEventType ContentType = 20412 + ContentType_DataStateType ContentType = 20500 + ContentType_DataStateEventType ContentType = 20501 + ContentType_UpdateTokenType ContentType = 20502 ) // Enum value maps for ContentType. @@ -92,7 +95,6 @@ var ( 20212: "RemoveTerminatorResponseType", 20213: "ValidateSessionsRequestType", 20214: "HealthEventType", - 20215: "SigningCertAddedType", 20216: "CreateTerminatorV2RequestType", 20217: "CreateTerminatorV2ResponseType", 20218: "CreateCircuitV2RequestType", @@ -114,6 +116,9 @@ var ( 20410: "RemoveTunnelTerminatorRequestType", 20411: "RemoveTunnelTerminatorResponseType", 20412: "TunnelHealthEventType", + 20500: "DataStateType", + 20501: "DataStateEventType", + 20502: "UpdateTokenType", } ContentType_value = map[string]int32{ "Zero": 0, @@ -136,7 +141,6 @@ var ( "RemoveTerminatorResponseType": 20212, "ValidateSessionsRequestType": 20213, "HealthEventType": 20214, - "SigningCertAddedType": 20215, "CreateTerminatorV2RequestType": 20216, "CreateTerminatorV2ResponseType": 20217, "CreateCircuitV2RequestType": 20218, @@ -158,6 +162,9 @@ var ( "RemoveTunnelTerminatorRequestType": 20410, "RemoveTunnelTerminatorResponseType": 20411, "TunnelHealthEventType": 20412, + "DataStateType": 20500, + "DataStateEventType": 20501, + "UpdateTokenType": 20502, } ) @@ -237,9 +244,11 @@ func (SessionType) EnumDescriptor() ([]byte, []int) { type Header int32 const ( - Header_HeaderZero Header = 0 - Header_TerminatorId Header = 1022 - Header_CheckPassed Header = 1023 + Header_HeaderZero Header = 0 + Header_TerminatorId Header = 1022 + Header_CheckPassed Header = 1023 + Header_RouterDataModel Header = 1024 + Header_RouterDataModelIndex Header = 1025 ) // Enum value maps for Header. @@ -248,11 +257,15 @@ var ( 0: "HeaderZero", 1022: "TerminatorId", 1023: "CheckPassed", + 1024: "RouterDataModel", + 1025: "RouterDataModelIndex", } Header_value = map[string]int32{ - "HeaderZero": 0, - "TerminatorId": 1022, - "CheckPassed": 1023, + "HeaderZero": 0, + "TerminatorId": 1022, + "CheckPassed": 1023, + "RouterDataModel": 1024, + "RouterDataModelIndex": 1025, } ) @@ -283,55 +296,6 @@ func (Header) EnumDescriptor() ([]byte, []int) { return file_edge_ctrl_proto_rawDescGZIP(), []int{2} } -type ConfigType int32 - -const ( - ConfigType_Add ConfigType = 0 - ConfigType_Remove ConfigType = 1 - ConfigType_Replace ConfigType = 2 -) - -// Enum value maps for ConfigType. -var ( - ConfigType_name = map[int32]string{ - 0: "Add", - 1: "Remove", - 2: "Replace", - } - ConfigType_value = map[string]int32{ - "Add": 0, - "Remove": 1, - "Replace": 2, - } -) - -func (x ConfigType) Enum() *ConfigType { - p := new(ConfigType) - *p = x - return p -} - -func (x ConfigType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ConfigType) Descriptor() protoreflect.EnumDescriptor { - return file_edge_ctrl_proto_enumTypes[3].Descriptor() -} - -func (ConfigType) Type() protoreflect.EnumType { - return &file_edge_ctrl_proto_enumTypes[3] -} - -func (x ConfigType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ConfigType.Descriptor instead. -func (ConfigType) EnumDescriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{3} -} - type TerminatorPrecedence int32 const ( @@ -365,11 +329,11 @@ func (x TerminatorPrecedence) String() string { } func (TerminatorPrecedence) Descriptor() protoreflect.EnumDescriptor { - return file_edge_ctrl_proto_enumTypes[4].Descriptor() + return file_edge_ctrl_proto_enumTypes[3].Descriptor() } func (TerminatorPrecedence) Type() protoreflect.EnumType { - return &file_edge_ctrl_proto_enumTypes[4] + return &file_edge_ctrl_proto_enumTypes[3] } func (x TerminatorPrecedence) Number() protoreflect.EnumNumber { @@ -378,7 +342,7 @@ func (x TerminatorPrecedence) Number() protoreflect.EnumNumber { // Deprecated: Use TerminatorPrecedence.Descriptor instead. func (TerminatorPrecedence) EnumDescriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{4} + return file_edge_ctrl_proto_rawDescGZIP(), []int{3} } type CreateTerminatorResult int32 @@ -420,11 +384,11 @@ func (x CreateTerminatorResult) String() string { } func (CreateTerminatorResult) Descriptor() protoreflect.EnumDescriptor { - return file_edge_ctrl_proto_enumTypes[5].Descriptor() + return file_edge_ctrl_proto_enumTypes[4].Descriptor() } func (CreateTerminatorResult) Type() protoreflect.EnumType { - return &file_edge_ctrl_proto_enumTypes[5] + return &file_edge_ctrl_proto_enumTypes[4] } func (x CreateTerminatorResult) Number() protoreflect.EnumNumber { @@ -433,7 +397,148 @@ func (x CreateTerminatorResult) Number() protoreflect.EnumNumber { // Deprecated: Use CreateTerminatorResult.Descriptor instead. func (CreateTerminatorResult) EnumDescriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{5} + return file_edge_ctrl_proto_rawDescGZIP(), []int{4} +} + +type DataState_Action int32 + +const ( + DataState_Create DataState_Action = 0 + DataState_Update DataState_Action = 1 + DataState_Delete DataState_Action = 2 +) + +// Enum value maps for DataState_Action. +var ( + DataState_Action_name = map[int32]string{ + 0: "Create", + 1: "Update", + 2: "Delete", + } + DataState_Action_value = map[string]int32{ + "Create": 0, + "Update": 1, + "Delete": 2, + } +) + +func (x DataState_Action) Enum() *DataState_Action { + p := new(DataState_Action) + *p = x + return p +} + +func (x DataState_Action) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DataState_Action) Descriptor() protoreflect.EnumDescriptor { + return file_edge_ctrl_proto_enumTypes[5].Descriptor() +} + +func (DataState_Action) Type() protoreflect.EnumType { + return &file_edge_ctrl_proto_enumTypes[5] +} + +func (x DataState_Action) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use DataState_Action.Descriptor instead. +func (DataState_Action) EnumDescriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 0} +} + +type DataState_PublicKey_Usage int32 + +const ( + DataState_PublicKey_JWTValidation DataState_PublicKey_Usage = 0 + DataState_PublicKey_ClientX509CertValidation DataState_PublicKey_Usage = 1 +) + +// Enum value maps for DataState_PublicKey_Usage. +var ( + DataState_PublicKey_Usage_name = map[int32]string{ + 0: "JWTValidation", + 1: "ClientX509CertValidation", + } + DataState_PublicKey_Usage_value = map[string]int32{ + "JWTValidation": 0, + "ClientX509CertValidation": 1, + } +) + +func (x DataState_PublicKey_Usage) Enum() *DataState_PublicKey_Usage { + p := new(DataState_PublicKey_Usage) + *p = x + return p +} + +func (x DataState_PublicKey_Usage) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DataState_PublicKey_Usage) Descriptor() protoreflect.EnumDescriptor { + return file_edge_ctrl_proto_enumTypes[6].Descriptor() +} + +func (DataState_PublicKey_Usage) Type() protoreflect.EnumType { + return &file_edge_ctrl_proto_enumTypes[6] +} + +func (x DataState_PublicKey_Usage) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use DataState_PublicKey_Usage.Descriptor instead. +func (DataState_PublicKey_Usage) EnumDescriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 5, 0} +} + +type DataState_PublicKey_Format int32 + +const ( + DataState_PublicKey_X509CertDer DataState_PublicKey_Format = 0 //x509 cert + DataState_PublicKey_PKIXPublicKey DataState_PublicKey_Format = 1 //asn.1 public key +) + +// Enum value maps for DataState_PublicKey_Format. +var ( + DataState_PublicKey_Format_name = map[int32]string{ + 0: "X509CertDer", + 1: "PKIXPublicKey", + } + DataState_PublicKey_Format_value = map[string]int32{ + "X509CertDer": 0, + "PKIXPublicKey": 1, + } +) + +func (x DataState_PublicKey_Format) Enum() *DataState_PublicKey_Format { + p := new(DataState_PublicKey_Format) + *p = x + return p +} + +func (x DataState_PublicKey_Format) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DataState_PublicKey_Format) Descriptor() protoreflect.EnumDescriptor { + return file_edge_ctrl_proto_enumTypes[7].Descriptor() +} + +func (DataState_PublicKey_Format) Type() protoreflect.EnumType { + return &file_edge_ctrl_proto_enumTypes[7] +} + +func (x DataState_PublicKey_Format) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use DataState_PublicKey_Format.Descriptor instead. +func (DataState_PublicKey_Format) EnumDescriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 5, 1} } type ServerHello struct { @@ -842,23 +947,17 @@ func (x *Service) GetEncryptionRequired() bool { return false } -type Config struct { +type DataState struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - SyncId string `protobuf:"bytes,1,opt,name=syncId,proto3" json:"syncId,omitempty"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` - Type ConfigType `protobuf:"varint,3,opt,name=type,proto3,enum=ziti.edge_ctrl.pb.ConfigType" json:"type,omitempty"` - SignerKeys [][]byte `protobuf:"bytes,4,rep,name=signerKeys,proto3" json:"signerKeys,omitempty"` - Identities []*Identity `protobuf:"bytes,5,rep,name=identities,proto3" json:"identities,omitempty"` - Services []*Service `protobuf:"bytes,6,rep,name=services,proto3" json:"services,omitempty"` - PostureSet []*PostureSet `protobuf:"bytes,7,rep,name=postureSet,proto3" json:"postureSet,omitempty"` - PostureChecks []*PostureCheck `protobuf:"bytes,8,rep,name=postureChecks,proto3" json:"postureChecks,omitempty"` + Events []*DataState_Event `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` + EndIndex uint64 `protobuf:"varint,2,opt,name=endIndex,proto3" json:"endIndex,omitempty"` } -func (x *Config) Reset() { - *x = Config{} +func (x *DataState) Reset() { + *x = DataState{} if protoimpl.UnsafeEnabled { mi := &file_edge_ctrl_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -866,13 +965,13 @@ func (x *Config) Reset() { } } -func (x *Config) String() string { +func (x *DataState) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Config) ProtoMessage() {} +func (*DataState) ProtoMessage() {} -func (x *Config) ProtoReflect() protoreflect.Message { +func (x *DataState) ProtoReflect() protoreflect.Message { mi := &file_edge_ctrl_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -884,77 +983,41 @@ func (x *Config) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Config.ProtoReflect.Descriptor instead. -func (*Config) Descriptor() ([]byte, []int) { +// Deprecated: Use DataState.ProtoReflect.Descriptor instead. +func (*DataState) Descriptor() ([]byte, []int) { return file_edge_ctrl_proto_rawDescGZIP(), []int{6} } -func (x *Config) GetSyncId() string { - if x != nil { - return x.SyncId - } - return "" -} - -func (x *Config) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *Config) GetType() ConfigType { +func (x *DataState) GetEvents() []*DataState_Event { if x != nil { - return x.Type - } - return ConfigType_Add -} - -func (x *Config) GetSignerKeys() [][]byte { - if x != nil { - return x.SignerKeys - } - return nil -} - -func (x *Config) GetIdentities() []*Identity { - if x != nil { - return x.Identities - } - return nil -} - -func (x *Config) GetServices() []*Service { - if x != nil { - return x.Services + return x.Events } return nil } -func (x *Config) GetPostureSet() []*PostureSet { +func (x *DataState) GetEndIndex() uint64 { if x != nil { - return x.PostureSet + return x.EndIndex } - return nil -} - -func (x *Config) GetPostureChecks() []*PostureCheck { - if x != nil { - return x.PostureChecks - } - return nil + return 0 } -type SignerCerts struct { +type Session struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Keys [][]byte `protobuf:"bytes,1,rep,name=keys,proto3" json:"keys,omitempty"` + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + Type SessionType `protobuf:"varint,2,opt,name=type,proto3,enum=ziti.edge_ctrl.pb.SessionType" json:"type,omitempty"` + CertFingerprints []string `protobuf:"bytes,3,rep,name=certFingerprints,proto3" json:"certFingerprints,omitempty"` + Urls []string `protobuf:"bytes,4,rep,name=urls,proto3" json:"urls,omitempty"` + Service *Service `protobuf:"bytes,5,opt,name=service,proto3" json:"service,omitempty"` + Id string `protobuf:"bytes,7,opt,name=id,proto3" json:"id,omitempty"` + ApiSessionId string `protobuf:"bytes,8,opt,name=apiSessionId,proto3" json:"apiSessionId,omitempty"` } -func (x *SignerCerts) Reset() { - *x = SignerCerts{} +func (x *Session) Reset() { + *x = Session{} if protoimpl.UnsafeEnabled { mi := &file_edge_ctrl_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -962,13 +1025,13 @@ func (x *SignerCerts) Reset() { } } -func (x *SignerCerts) String() string { +func (x *Session) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SignerCerts) ProtoMessage() {} +func (*Session) ProtoMessage() {} -func (x *SignerCerts) ProtoReflect() protoreflect.Message { +func (x *Session) ProtoReflect() protoreflect.Message { mi := &file_edge_ctrl_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -980,30 +1043,72 @@ func (x *SignerCerts) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SignerCerts.ProtoReflect.Descriptor instead. -func (*SignerCerts) Descriptor() ([]byte, []int) { +// Deprecated: Use Session.ProtoReflect.Descriptor instead. +func (*Session) Descriptor() ([]byte, []int) { return file_edge_ctrl_proto_rawDescGZIP(), []int{7} } -func (x *SignerCerts) GetKeys() [][]byte { +func (x *Session) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +func (x *Session) GetType() SessionType { + if x != nil { + return x.Type + } + return SessionType_Dial +} + +func (x *Session) GetCertFingerprints() []string { + if x != nil { + return x.CertFingerprints + } + return nil +} + +func (x *Session) GetUrls() []string { + if x != nil { + return x.Urls + } + return nil +} + +func (x *Session) GetService() *Service { if x != nil { - return x.Keys + return x.Service } return nil } -type Identity struct { +func (x *Session) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *Session) GetApiSessionId() string { + if x != nil { + return x.ApiSessionId + } + return "" +} + +type ApiSession struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - ServiceIds []string `protobuf:"bytes,3,rep,name=serviceIds,proto3" json:"serviceIds,omitempty"` + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + CertFingerprints []string `protobuf:"bytes,2,rep,name=certFingerprints,proto3" json:"certFingerprints,omitempty"` + Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` } -func (x *Identity) Reset() { - *x = Identity{} +func (x *ApiSession) Reset() { + *x = ApiSession{} if protoimpl.UnsafeEnabled { mi := &file_edge_ctrl_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1011,13 +1116,13 @@ func (x *Identity) Reset() { } } -func (x *Identity) String() string { +func (x *ApiSession) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Identity) ProtoMessage() {} +func (*ApiSession) ProtoMessage() {} -func (x *Identity) ProtoReflect() protoreflect.Message { +func (x *ApiSession) ProtoReflect() protoreflect.Message { mi := &file_edge_ctrl_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1029,44 +1134,43 @@ func (x *Identity) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Identity.ProtoReflect.Descriptor instead. -func (*Identity) Descriptor() ([]byte, []int) { +// Deprecated: Use ApiSession.ProtoReflect.Descriptor instead. +func (*ApiSession) Descriptor() ([]byte, []int) { return file_edge_ctrl_proto_rawDescGZIP(), []int{8} } -func (x *Identity) GetId() string { +func (x *ApiSession) GetToken() string { if x != nil { - return x.Id + return x.Token } return "" } -func (x *Identity) GetName() string { +func (x *ApiSession) GetCertFingerprints() []string { if x != nil { - return x.Name + return x.CertFingerprints } - return "" + return nil } -func (x *Identity) GetServiceIds() []string { +func (x *ApiSession) GetId() string { if x != nil { - return x.ServiceIds + return x.Id } - return nil + return "" } -type PostureSet struct { +type ApiSessionAdded struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - PostureCheckIds []string `protobuf:"bytes,3,rep,name=postureCheckIds,proto3" json:"postureCheckIds,omitempty"` + IsFullState bool `protobuf:"varint,1,opt,name=isFullState,proto3" json:"isFullState,omitempty"` + ApiSessions []*ApiSession `protobuf:"bytes,2,rep,name=apiSessions,proto3" json:"apiSessions,omitempty"` } -func (x *PostureSet) Reset() { - *x = PostureSet{} +func (x *ApiSessionAdded) Reset() { + *x = ApiSessionAdded{} if protoimpl.UnsafeEnabled { mi := &file_edge_ctrl_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1074,13 +1178,13 @@ func (x *PostureSet) Reset() { } } -func (x *PostureSet) String() string { +func (x *ApiSessionAdded) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PostureSet) ProtoMessage() {} +func (*ApiSessionAdded) ProtoMessage() {} -func (x *PostureSet) ProtoReflect() protoreflect.Message { +func (x *ApiSessionAdded) ProtoReflect() protoreflect.Message { mi := &file_edge_ctrl_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1092,44 +1196,35 @@ func (x *PostureSet) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PostureSet.ProtoReflect.Descriptor instead. -func (*PostureSet) Descriptor() ([]byte, []int) { +// Deprecated: Use ApiSessionAdded.ProtoReflect.Descriptor instead. +func (*ApiSessionAdded) Descriptor() ([]byte, []int) { return file_edge_ctrl_proto_rawDescGZIP(), []int{9} } -func (x *PostureSet) GetId() string { +func (x *ApiSessionAdded) GetIsFullState() bool { if x != nil { - return x.Id + return x.IsFullState } - return "" + return false } -func (x *PostureSet) GetName() string { +func (x *ApiSessionAdded) GetApiSessions() []*ApiSession { if x != nil { - return x.Name + return x.ApiSessions } - return "" + return nil } -func (x *PostureSet) GetPostureCheckIds() []string { - if x != nil { - return x.PostureCheckIds - } - return nil -} - -type PostureCheck struct { +type ApiSessionUpdated struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` - Data map[string][]byte `protobuf:"bytes,3,rep,name=data,proto3" json:"data,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ApiSessions []*ApiSession `protobuf:"bytes,1,rep,name=apiSessions,proto3" json:"apiSessions,omitempty"` } -func (x *PostureCheck) Reset() { - *x = PostureCheck{} +func (x *ApiSessionUpdated) Reset() { + *x = ApiSessionUpdated{} if protoimpl.UnsafeEnabled { mi := &file_edge_ctrl_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1137,13 +1232,13 @@ func (x *PostureCheck) Reset() { } } -func (x *PostureCheck) String() string { +func (x *ApiSessionUpdated) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PostureCheck) ProtoMessage() {} +func (*ApiSessionUpdated) ProtoMessage() {} -func (x *PostureCheck) ProtoReflect() protoreflect.Message { +func (x *ApiSessionUpdated) ProtoReflect() protoreflect.Message { mi := &file_edge_ctrl_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1155,48 +1250,29 @@ func (x *PostureCheck) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PostureCheck.ProtoReflect.Descriptor instead. -func (*PostureCheck) Descriptor() ([]byte, []int) { +// Deprecated: Use ApiSessionUpdated.ProtoReflect.Descriptor instead. +func (*ApiSessionUpdated) Descriptor() ([]byte, []int) { return file_edge_ctrl_proto_rawDescGZIP(), []int{10} } -func (x *PostureCheck) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *PostureCheck) GetType() string { - if x != nil { - return x.Type - } - return "" -} - -func (x *PostureCheck) GetData() map[string][]byte { +func (x *ApiSessionUpdated) GetApiSessions() []*ApiSession { if x != nil { - return x.Data + return x.ApiSessions } return nil } -type Session struct { +type ApiSessionRemoved struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` - Type SessionType `protobuf:"varint,2,opt,name=type,proto3,enum=ziti.edge_ctrl.pb.SessionType" json:"type,omitempty"` - CertFingerprints []string `protobuf:"bytes,3,rep,name=certFingerprints,proto3" json:"certFingerprints,omitempty"` - Urls []string `protobuf:"bytes,4,rep,name=urls,proto3" json:"urls,omitempty"` - Service *Service `protobuf:"bytes,5,opt,name=service,proto3" json:"service,omitempty"` - Id string `protobuf:"bytes,7,opt,name=id,proto3" json:"id,omitempty"` - ApiSessionId string `protobuf:"bytes,8,opt,name=apiSessionId,proto3" json:"apiSessionId,omitempty"` + Tokens []string `protobuf:"bytes,1,rep,name=tokens,proto3" json:"tokens,omitempty"` + Ids []string `protobuf:"bytes,2,rep,name=ids,proto3" json:"ids,omitempty"` } -func (x *Session) Reset() { - *x = Session{} +func (x *ApiSessionRemoved) Reset() { + *x = ApiSessionRemoved{} if protoimpl.UnsafeEnabled { mi := &file_edge_ctrl_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1204,13 +1280,13 @@ func (x *Session) Reset() { } } -func (x *Session) String() string { +func (x *ApiSessionRemoved) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Session) ProtoMessage() {} +func (*ApiSessionRemoved) ProtoMessage() {} -func (x *Session) ProtoReflect() protoreflect.Message { +func (x *ApiSessionRemoved) ProtoReflect() protoreflect.Message { mi := &file_edge_ctrl_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1222,72 +1298,35 @@ func (x *Session) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Session.ProtoReflect.Descriptor instead. -func (*Session) Descriptor() ([]byte, []int) { +// Deprecated: Use ApiSessionRemoved.ProtoReflect.Descriptor instead. +func (*ApiSessionRemoved) Descriptor() ([]byte, []int) { return file_edge_ctrl_proto_rawDescGZIP(), []int{11} } -func (x *Session) GetToken() string { - if x != nil { - return x.Token - } - return "" -} - -func (x *Session) GetType() SessionType { - if x != nil { - return x.Type - } - return SessionType_Dial -} - -func (x *Session) GetCertFingerprints() []string { - if x != nil { - return x.CertFingerprints - } - return nil -} - -func (x *Session) GetUrls() []string { +func (x *ApiSessionRemoved) GetTokens() []string { if x != nil { - return x.Urls + return x.Tokens } return nil } -func (x *Session) GetService() *Service { +func (x *ApiSessionRemoved) GetIds() []string { if x != nil { - return x.Service + return x.Ids } return nil } -func (x *Session) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *Session) GetApiSessionId() string { - if x != nil { - return x.ApiSessionId - } - return "" -} - -type ApiSession struct { +type ApiSessionHeartbeat struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` - CertFingerprints []string `protobuf:"bytes,2,rep,name=certFingerprints,proto3" json:"certFingerprints,omitempty"` - Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` + Tokens []string `protobuf:"bytes,1,rep,name=tokens,proto3" json:"tokens,omitempty"` } -func (x *ApiSession) Reset() { - *x = ApiSession{} +func (x *ApiSessionHeartbeat) Reset() { + *x = ApiSessionHeartbeat{} if protoimpl.UnsafeEnabled { mi := &file_edge_ctrl_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1295,13 +1334,13 @@ func (x *ApiSession) Reset() { } } -func (x *ApiSession) String() string { +func (x *ApiSessionHeartbeat) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ApiSession) ProtoMessage() {} +func (*ApiSessionHeartbeat) ProtoMessage() {} -func (x *ApiSession) ProtoReflect() protoreflect.Message { +func (x *ApiSessionHeartbeat) ProtoReflect() protoreflect.Message { mi := &file_edge_ctrl_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1313,43 +1352,29 @@ func (x *ApiSession) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ApiSession.ProtoReflect.Descriptor instead. -func (*ApiSession) Descriptor() ([]byte, []int) { +// Deprecated: Use ApiSessionHeartbeat.ProtoReflect.Descriptor instead. +func (*ApiSessionHeartbeat) Descriptor() ([]byte, []int) { return file_edge_ctrl_proto_rawDescGZIP(), []int{12} } -func (x *ApiSession) GetToken() string { - if x != nil { - return x.Token - } - return "" -} - -func (x *ApiSession) GetCertFingerprints() []string { +func (x *ApiSessionHeartbeat) GetTokens() []string { if x != nil { - return x.CertFingerprints + return x.Tokens } return nil } -func (x *ApiSession) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -type ApiSessionAdded struct { +type SessionRemoved struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - IsFullState bool `protobuf:"varint,1,opt,name=isFullState,proto3" json:"isFullState,omitempty"` - ApiSessions []*ApiSession `protobuf:"bytes,2,rep,name=apiSessions,proto3" json:"apiSessions,omitempty"` + Tokens []string `protobuf:"bytes,1,rep,name=tokens,proto3" json:"tokens,omitempty"` + Ids []string `protobuf:"bytes,2,rep,name=ids,proto3" json:"ids,omitempty"` } -func (x *ApiSessionAdded) Reset() { - *x = ApiSessionAdded{} +func (x *SessionRemoved) Reset() { + *x = SessionRemoved{} if protoimpl.UnsafeEnabled { mi := &file_edge_ctrl_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1357,13 +1382,13 @@ func (x *ApiSessionAdded) Reset() { } } -func (x *ApiSessionAdded) String() string { +func (x *SessionRemoved) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ApiSessionAdded) ProtoMessage() {} +func (*SessionRemoved) ProtoMessage() {} -func (x *ApiSessionAdded) ProtoReflect() protoreflect.Message { +func (x *SessionRemoved) ProtoReflect() protoreflect.Message { mi := &file_edge_ctrl_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1375,35 +1400,35 @@ func (x *ApiSessionAdded) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ApiSessionAdded.ProtoReflect.Descriptor instead. -func (*ApiSessionAdded) Descriptor() ([]byte, []int) { +// Deprecated: Use SessionRemoved.ProtoReflect.Descriptor instead. +func (*SessionRemoved) Descriptor() ([]byte, []int) { return file_edge_ctrl_proto_rawDescGZIP(), []int{13} } -func (x *ApiSessionAdded) GetIsFullState() bool { +func (x *SessionRemoved) GetTokens() []string { if x != nil { - return x.IsFullState + return x.Tokens } - return false + return nil } -func (x *ApiSessionAdded) GetApiSessions() []*ApiSession { +func (x *SessionRemoved) GetIds() []string { if x != nil { - return x.ApiSessions + return x.Ids } return nil } -type ApiSessionUpdated struct { +type RequestClientReSync struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ApiSessions []*ApiSession `protobuf:"bytes,1,rep,name=apiSessions,proto3" json:"apiSessions,omitempty"` + Reason string `protobuf:"bytes,1,opt,name=reason,proto3" json:"reason,omitempty"` } -func (x *ApiSessionUpdated) Reset() { - *x = ApiSessionUpdated{} +func (x *RequestClientReSync) Reset() { + *x = RequestClientReSync{} if protoimpl.UnsafeEnabled { mi := &file_edge_ctrl_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1411,13 +1436,13 @@ func (x *ApiSessionUpdated) Reset() { } } -func (x *ApiSessionUpdated) String() string { +func (x *RequestClientReSync) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ApiSessionUpdated) ProtoMessage() {} +func (*RequestClientReSync) ProtoMessage() {} -func (x *ApiSessionUpdated) ProtoReflect() protoreflect.Message { +func (x *RequestClientReSync) ProtoReflect() protoreflect.Message { mi := &file_edge_ctrl_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1429,29 +1454,32 @@ func (x *ApiSessionUpdated) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ApiSessionUpdated.ProtoReflect.Descriptor instead. -func (*ApiSessionUpdated) Descriptor() ([]byte, []int) { +// Deprecated: Use RequestClientReSync.ProtoReflect.Descriptor instead. +func (*RequestClientReSync) Descriptor() ([]byte, []int) { return file_edge_ctrl_proto_rawDescGZIP(), []int{14} } -func (x *ApiSessionUpdated) GetApiSessions() []*ApiSession { +func (x *RequestClientReSync) GetReason() string { if x != nil { - return x.ApiSessions + return x.Reason } - return nil + return "" } -type ApiSessionRemoved struct { +type CreateCircuitRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Tokens []string `protobuf:"bytes,1,rep,name=tokens,proto3" json:"tokens,omitempty"` - Ids []string `protobuf:"bytes,2,rep,name=ids,proto3" json:"ids,omitempty"` + SessionToken string `protobuf:"bytes,1,opt,name=sessionToken,proto3" json:"sessionToken,omitempty"` + Fingerprints []string `protobuf:"bytes,2,rep,name=fingerprints,proto3" json:"fingerprints,omitempty"` + TerminatorInstanceId string `protobuf:"bytes,3,opt,name=terminatorInstanceId,proto3" json:"terminatorInstanceId,omitempty"` + PeerData map[uint32][]byte `protobuf:"bytes,4,rep,name=peerData,proto3" json:"peerData,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ApiSessionToken string `protobuf:"bytes,5,opt,name=apiSessionToken,proto3" json:"apiSessionToken,omitempty"` } -func (x *ApiSessionRemoved) Reset() { - *x = ApiSessionRemoved{} +func (x *CreateCircuitRequest) Reset() { + *x = CreateCircuitRequest{} if protoimpl.UnsafeEnabled { mi := &file_edge_ctrl_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1459,13 +1487,13 @@ func (x *ApiSessionRemoved) Reset() { } } -func (x *ApiSessionRemoved) String() string { +func (x *CreateCircuitRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ApiSessionRemoved) ProtoMessage() {} +func (*CreateCircuitRequest) ProtoMessage() {} -func (x *ApiSessionRemoved) ProtoReflect() protoreflect.Message { +func (x *CreateCircuitRequest) ProtoReflect() protoreflect.Message { mi := &file_edge_ctrl_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1477,35 +1505,59 @@ func (x *ApiSessionRemoved) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ApiSessionRemoved.ProtoReflect.Descriptor instead. -func (*ApiSessionRemoved) Descriptor() ([]byte, []int) { +// Deprecated: Use CreateCircuitRequest.ProtoReflect.Descriptor instead. +func (*CreateCircuitRequest) Descriptor() ([]byte, []int) { return file_edge_ctrl_proto_rawDescGZIP(), []int{15} } -func (x *ApiSessionRemoved) GetTokens() []string { +func (x *CreateCircuitRequest) GetSessionToken() string { if x != nil { - return x.Tokens + return x.SessionToken + } + return "" +} + +func (x *CreateCircuitRequest) GetFingerprints() []string { + if x != nil { + return x.Fingerprints } return nil } -func (x *ApiSessionRemoved) GetIds() []string { +func (x *CreateCircuitRequest) GetTerminatorInstanceId() string { if x != nil { - return x.Ids + return x.TerminatorInstanceId + } + return "" +} + +func (x *CreateCircuitRequest) GetPeerData() map[uint32][]byte { + if x != nil { + return x.PeerData } return nil } -type ApiSessionHeartbeat struct { +func (x *CreateCircuitRequest) GetApiSessionToken() string { + if x != nil { + return x.ApiSessionToken + } + return "" +} + +type CreateCircuitResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Tokens []string `protobuf:"bytes,1,rep,name=tokens,proto3" json:"tokens,omitempty"` + CircuitId string `protobuf:"bytes,1,opt,name=circuitId,proto3" json:"circuitId,omitempty"` + Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` + PeerData map[uint32][]byte `protobuf:"bytes,3,rep,name=peerData,proto3" json:"peerData,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Tags map[string]string `protobuf:"bytes,4,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (x *ApiSessionHeartbeat) Reset() { - *x = ApiSessionHeartbeat{} +func (x *CreateCircuitResponse) Reset() { + *x = CreateCircuitResponse{} if protoimpl.UnsafeEnabled { mi := &file_edge_ctrl_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1513,13 +1565,13 @@ func (x *ApiSessionHeartbeat) Reset() { } } -func (x *ApiSessionHeartbeat) String() string { +func (x *CreateCircuitResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ApiSessionHeartbeat) ProtoMessage() {} +func (*CreateCircuitResponse) ProtoMessage() {} -func (x *ApiSessionHeartbeat) ProtoReflect() protoreflect.Message { +func (x *CreateCircuitResponse) ProtoReflect() protoreflect.Message { mi := &file_edge_ctrl_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1531,232 +1583,9 @@ func (x *ApiSessionHeartbeat) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ApiSessionHeartbeat.ProtoReflect.Descriptor instead. -func (*ApiSessionHeartbeat) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{16} -} - -func (x *ApiSessionHeartbeat) GetTokens() []string { - if x != nil { - return x.Tokens - } - return nil -} - -type SessionRemoved struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Tokens []string `protobuf:"bytes,1,rep,name=tokens,proto3" json:"tokens,omitempty"` - Ids []string `protobuf:"bytes,2,rep,name=ids,proto3" json:"ids,omitempty"` -} - -func (x *SessionRemoved) Reset() { - *x = SessionRemoved{} - if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SessionRemoved) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SessionRemoved) ProtoMessage() {} - -func (x *SessionRemoved) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_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 SessionRemoved.ProtoReflect.Descriptor instead. -func (*SessionRemoved) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{17} -} - -func (x *SessionRemoved) GetTokens() []string { - if x != nil { - return x.Tokens - } - return nil -} - -func (x *SessionRemoved) GetIds() []string { - if x != nil { - return x.Ids - } - return nil -} - -type RequestClientReSync struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Reason string `protobuf:"bytes,1,opt,name=reason,proto3" json:"reason,omitempty"` -} - -func (x *RequestClientReSync) Reset() { - *x = RequestClientReSync{} - if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RequestClientReSync) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RequestClientReSync) ProtoMessage() {} - -func (x *RequestClientReSync) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_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 RequestClientReSync.ProtoReflect.Descriptor instead. -func (*RequestClientReSync) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{18} -} - -func (x *RequestClientReSync) GetReason() string { - if x != nil { - return x.Reason - } - return "" -} - -type CreateCircuitRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - SessionToken string `protobuf:"bytes,1,opt,name=sessionToken,proto3" json:"sessionToken,omitempty"` - Fingerprints []string `protobuf:"bytes,2,rep,name=fingerprints,proto3" json:"fingerprints,omitempty"` - TerminatorInstanceId string `protobuf:"bytes,3,opt,name=terminatorInstanceId,proto3" json:"terminatorInstanceId,omitempty"` - PeerData map[uint32][]byte `protobuf:"bytes,4,rep,name=peerData,proto3" json:"peerData,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` -} - -func (x *CreateCircuitRequest) Reset() { - *x = CreateCircuitRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CreateCircuitRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CreateCircuitRequest) ProtoMessage() {} - -func (x *CreateCircuitRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_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 CreateCircuitRequest.ProtoReflect.Descriptor instead. -func (*CreateCircuitRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{19} -} - -func (x *CreateCircuitRequest) GetSessionToken() string { - if x != nil { - return x.SessionToken - } - return "" -} - -func (x *CreateCircuitRequest) GetFingerprints() []string { - if x != nil { - return x.Fingerprints - } - return nil -} - -func (x *CreateCircuitRequest) GetTerminatorInstanceId() string { - if x != nil { - return x.TerminatorInstanceId - } - return "" -} - -func (x *CreateCircuitRequest) GetPeerData() map[uint32][]byte { - if x != nil { - return x.PeerData - } - return nil -} - -type CreateCircuitResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - CircuitId string `protobuf:"bytes,1,opt,name=circuitId,proto3" json:"circuitId,omitempty"` - Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` - PeerData map[uint32][]byte `protobuf:"bytes,3,rep,name=peerData,proto3" json:"peerData,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Tags map[string]string `protobuf:"bytes,4,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` -} - -func (x *CreateCircuitResponse) Reset() { - *x = CreateCircuitResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CreateCircuitResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CreateCircuitResponse) ProtoMessage() {} - -func (x *CreateCircuitResponse) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_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 CreateCircuitResponse.ProtoReflect.Descriptor instead. func (*CreateCircuitResponse) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{20} + return file_edge_ctrl_proto_rawDescGZIP(), []int{16} } func (x *CreateCircuitResponse) GetCircuitId() string { @@ -1792,19 +1621,20 @@ type CreateTerminatorRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - SessionToken string `protobuf:"bytes,1,opt,name=sessionToken,proto3" json:"sessionToken,omitempty"` - Fingerprints []string `protobuf:"bytes,2,rep,name=fingerprints,proto3" json:"fingerprints,omitempty"` - PeerData map[uint32][]byte `protobuf:"bytes,3,rep,name=peerData,proto3" json:"peerData,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Cost uint32 `protobuf:"varint,4,opt,name=cost,proto3" json:"cost,omitempty"` - Precedence TerminatorPrecedence `protobuf:"varint,5,opt,name=precedence,proto3,enum=ziti.edge_ctrl.pb.TerminatorPrecedence" json:"precedence,omitempty"` - InstanceId string `protobuf:"bytes,6,opt,name=instanceId,proto3" json:"instanceId,omitempty"` - InstanceSecret []byte `protobuf:"bytes,7,opt,name=instanceSecret,proto3" json:"instanceSecret,omitempty"` + SessionToken string `protobuf:"bytes,1,opt,name=sessionToken,proto3" json:"sessionToken,omitempty"` + Fingerprints []string `protobuf:"bytes,2,rep,name=fingerprints,proto3" json:"fingerprints,omitempty"` + PeerData map[uint32][]byte `protobuf:"bytes,3,rep,name=peerData,proto3" json:"peerData,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Cost uint32 `protobuf:"varint,4,opt,name=cost,proto3" json:"cost,omitempty"` + Precedence TerminatorPrecedence `protobuf:"varint,5,opt,name=precedence,proto3,enum=ziti.edge_ctrl.pb.TerminatorPrecedence" json:"precedence,omitempty"` + InstanceId string `protobuf:"bytes,6,opt,name=instanceId,proto3" json:"instanceId,omitempty"` + InstanceSecret []byte `protobuf:"bytes,7,opt,name=instanceSecret,proto3" json:"instanceSecret,omitempty"` + ApiSessionToken string `protobuf:"bytes,8,opt,name=apiSessionToken,proto3" json:"apiSessionToken,omitempty"` } func (x *CreateTerminatorRequest) Reset() { *x = CreateTerminatorRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[21] + mi := &file_edge_ctrl_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1817,7 +1647,7 @@ func (x *CreateTerminatorRequest) String() string { func (*CreateTerminatorRequest) ProtoMessage() {} func (x *CreateTerminatorRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[21] + mi := &file_edge_ctrl_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1830,7 +1660,7 @@ func (x *CreateTerminatorRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTerminatorRequest.ProtoReflect.Descriptor instead. func (*CreateTerminatorRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{21} + return file_edge_ctrl_proto_rawDescGZIP(), []int{17} } func (x *CreateTerminatorRequest) GetSessionToken() string { @@ -1882,25 +1712,33 @@ func (x *CreateTerminatorRequest) GetInstanceSecret() []byte { return nil } +func (x *CreateTerminatorRequest) GetApiSessionToken() string { + if x != nil { + return x.ApiSessionToken + } + return "" +} + type CreateTerminatorV2Request struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` - SessionToken string `protobuf:"bytes,2,opt,name=sessionToken,proto3" json:"sessionToken,omitempty"` - Fingerprints []string `protobuf:"bytes,3,rep,name=fingerprints,proto3" json:"fingerprints,omitempty"` - PeerData map[uint32][]byte `protobuf:"bytes,4,rep,name=peerData,proto3" json:"peerData,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Cost uint32 `protobuf:"varint,5,opt,name=cost,proto3" json:"cost,omitempty"` - Precedence TerminatorPrecedence `protobuf:"varint,6,opt,name=precedence,proto3,enum=ziti.edge_ctrl.pb.TerminatorPrecedence" json:"precedence,omitempty"` - InstanceId string `protobuf:"bytes,7,opt,name=instanceId,proto3" json:"instanceId,omitempty"` - InstanceSecret []byte `protobuf:"bytes,8,opt,name=instanceSecret,proto3" json:"instanceSecret,omitempty"` + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + SessionToken string `protobuf:"bytes,2,opt,name=sessionToken,proto3" json:"sessionToken,omitempty"` + Fingerprints []string `protobuf:"bytes,3,rep,name=fingerprints,proto3" json:"fingerprints,omitempty"` + PeerData map[uint32][]byte `protobuf:"bytes,4,rep,name=peerData,proto3" json:"peerData,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Cost uint32 `protobuf:"varint,5,opt,name=cost,proto3" json:"cost,omitempty"` + Precedence TerminatorPrecedence `protobuf:"varint,6,opt,name=precedence,proto3,enum=ziti.edge_ctrl.pb.TerminatorPrecedence" json:"precedence,omitempty"` + InstanceId string `protobuf:"bytes,7,opt,name=instanceId,proto3" json:"instanceId,omitempty"` + InstanceSecret []byte `protobuf:"bytes,8,opt,name=instanceSecret,proto3" json:"instanceSecret,omitempty"` + ApiSessionToken string `protobuf:"bytes,9,opt,name=apiSessionToken,proto3" json:"apiSessionToken,omitempty"` } func (x *CreateTerminatorV2Request) Reset() { *x = CreateTerminatorV2Request{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[22] + mi := &file_edge_ctrl_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1913,7 +1751,7 @@ func (x *CreateTerminatorV2Request) String() string { func (*CreateTerminatorV2Request) ProtoMessage() {} func (x *CreateTerminatorV2Request) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[22] + mi := &file_edge_ctrl_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1926,7 +1764,7 @@ func (x *CreateTerminatorV2Request) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTerminatorV2Request.ProtoReflect.Descriptor instead. func (*CreateTerminatorV2Request) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{22} + return file_edge_ctrl_proto_rawDescGZIP(), []int{18} } func (x *CreateTerminatorV2Request) GetAddress() string { @@ -1985,6 +1823,13 @@ func (x *CreateTerminatorV2Request) GetInstanceSecret() []byte { return nil } +func (x *CreateTerminatorV2Request) GetApiSessionToken() string { + if x != nil { + return x.ApiSessionToken + } + return "" +} + type CreateTerminatorV2Response struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1998,7 +1843,7 @@ type CreateTerminatorV2Response struct { func (x *CreateTerminatorV2Response) Reset() { *x = CreateTerminatorV2Response{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[23] + mi := &file_edge_ctrl_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2011,7 +1856,7 @@ func (x *CreateTerminatorV2Response) String() string { func (*CreateTerminatorV2Response) ProtoMessage() {} func (x *CreateTerminatorV2Response) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[23] + mi := &file_edge_ctrl_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2024,7 +1869,7 @@ func (x *CreateTerminatorV2Response) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTerminatorV2Response.ProtoReflect.Descriptor instead. func (*CreateTerminatorV2Response) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{23} + return file_edge_ctrl_proto_rawDescGZIP(), []int{19} } func (x *CreateTerminatorV2Response) GetTerminatorId() string { @@ -2053,15 +1898,16 @@ type RemoveTerminatorRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - SessionToken string `protobuf:"bytes,1,opt,name=sessionToken,proto3" json:"sessionToken,omitempty"` - Fingerprints []string `protobuf:"bytes,2,rep,name=fingerprints,proto3" json:"fingerprints,omitempty"` - TerminatorId string `protobuf:"bytes,3,opt,name=terminatorId,proto3" json:"terminatorId,omitempty"` + SessionToken string `protobuf:"bytes,1,opt,name=sessionToken,proto3" json:"sessionToken,omitempty"` + Fingerprints []string `protobuf:"bytes,2,rep,name=fingerprints,proto3" json:"fingerprints,omitempty"` + TerminatorId string `protobuf:"bytes,3,opt,name=terminatorId,proto3" json:"terminatorId,omitempty"` + ApiSessionToken string `protobuf:"bytes,4,opt,name=apiSessionToken,proto3" json:"apiSessionToken,omitempty"` } func (x *RemoveTerminatorRequest) Reset() { *x = RemoveTerminatorRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[24] + mi := &file_edge_ctrl_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2074,7 +1920,7 @@ func (x *RemoveTerminatorRequest) String() string { func (*RemoveTerminatorRequest) ProtoMessage() {} func (x *RemoveTerminatorRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[24] + mi := &file_edge_ctrl_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2087,7 +1933,7 @@ func (x *RemoveTerminatorRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveTerminatorRequest.ProtoReflect.Descriptor instead. func (*RemoveTerminatorRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{24} + return file_edge_ctrl_proto_rawDescGZIP(), []int{20} } func (x *RemoveTerminatorRequest) GetSessionToken() string { @@ -2111,6 +1957,13 @@ func (x *RemoveTerminatorRequest) GetTerminatorId() string { return "" } +func (x *RemoveTerminatorRequest) GetApiSessionToken() string { + if x != nil { + return x.ApiSessionToken + } + return "" +} + type UpdateTerminatorRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2123,12 +1976,13 @@ type UpdateTerminatorRequest struct { Precedence TerminatorPrecedence `protobuf:"varint,5,opt,name=precedence,proto3,enum=ziti.edge_ctrl.pb.TerminatorPrecedence" json:"precedence,omitempty"` UpdatePrecedence bool `protobuf:"varint,6,opt,name=updatePrecedence,proto3" json:"updatePrecedence,omitempty"` UpdateCost bool `protobuf:"varint,7,opt,name=updateCost,proto3" json:"updateCost,omitempty"` + ApiSessionToken string `protobuf:"bytes,8,opt,name=apiSessionToken,proto3" json:"apiSessionToken,omitempty"` } func (x *UpdateTerminatorRequest) Reset() { *x = UpdateTerminatorRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[25] + mi := &file_edge_ctrl_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2141,7 +1995,7 @@ func (x *UpdateTerminatorRequest) String() string { func (*UpdateTerminatorRequest) ProtoMessage() {} func (x *UpdateTerminatorRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[25] + mi := &file_edge_ctrl_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2154,7 +2008,7 @@ func (x *UpdateTerminatorRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateTerminatorRequest.ProtoReflect.Descriptor instead. func (*UpdateTerminatorRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{25} + return file_edge_ctrl_proto_rawDescGZIP(), []int{21} } func (x *UpdateTerminatorRequest) GetSessionToken() string { @@ -2206,21 +2060,29 @@ func (x *UpdateTerminatorRequest) GetUpdateCost() bool { return false } +func (x *UpdateTerminatorRequest) GetApiSessionToken() string { + if x != nil { + return x.ApiSessionToken + } + return "" +} + type HealthEventRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - SessionToken string `protobuf:"bytes,1,opt,name=sessionToken,proto3" json:"sessionToken,omitempty"` - Fingerprints []string `protobuf:"bytes,2,rep,name=fingerprints,proto3" json:"fingerprints,omitempty"` - TerminatorId string `protobuf:"bytes,3,opt,name=terminatorId,proto3" json:"terminatorId,omitempty"` - CheckPassed bool `protobuf:"varint,4,opt,name=checkPassed,proto3" json:"checkPassed,omitempty"` + SessionToken string `protobuf:"bytes,1,opt,name=sessionToken,proto3" json:"sessionToken,omitempty"` + Fingerprints []string `protobuf:"bytes,2,rep,name=fingerprints,proto3" json:"fingerprints,omitempty"` + TerminatorId string `protobuf:"bytes,3,opt,name=terminatorId,proto3" json:"terminatorId,omitempty"` + CheckPassed bool `protobuf:"varint,4,opt,name=checkPassed,proto3" json:"checkPassed,omitempty"` + ApiSessionToken string `protobuf:"bytes,5,opt,name=apiSessionToken,proto3" json:"apiSessionToken,omitempty"` } func (x *HealthEventRequest) Reset() { *x = HealthEventRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[26] + mi := &file_edge_ctrl_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2233,7 +2095,7 @@ func (x *HealthEventRequest) String() string { func (*HealthEventRequest) ProtoMessage() {} func (x *HealthEventRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[26] + mi := &file_edge_ctrl_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2246,7 +2108,7 @@ func (x *HealthEventRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HealthEventRequest.ProtoReflect.Descriptor instead. func (*HealthEventRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{26} + return file_edge_ctrl_proto_rawDescGZIP(), []int{22} } func (x *HealthEventRequest) GetSessionToken() string { @@ -2277,6 +2139,13 @@ func (x *HealthEventRequest) GetCheckPassed() bool { return false } +func (x *HealthEventRequest) GetApiSessionToken() string { + if x != nil { + return x.ApiSessionToken + } + return "" +} + type ValidateSessionsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2288,7 +2157,7 @@ type ValidateSessionsRequest struct { func (x *ValidateSessionsRequest) Reset() { *x = ValidateSessionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[27] + mi := &file_edge_ctrl_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2301,7 +2170,7 @@ func (x *ValidateSessionsRequest) String() string { func (*ValidateSessionsRequest) ProtoMessage() {} func (x *ValidateSessionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[27] + mi := &file_edge_ctrl_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2314,7 +2183,7 @@ func (x *ValidateSessionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateSessionsRequest.ProtoReflect.Descriptor instead. func (*ValidateSessionsRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{27} + return file_edge_ctrl_proto_rawDescGZIP(), []int{23} } func (x *ValidateSessionsRequest) GetSessionTokens() []string { @@ -2340,7 +2209,7 @@ type EnvInfo struct { func (x *EnvInfo) Reset() { *x = EnvInfo{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[28] + mi := &file_edge_ctrl_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2353,7 +2222,7 @@ func (x *EnvInfo) String() string { func (*EnvInfo) ProtoMessage() {} func (x *EnvInfo) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[28] + mi := &file_edge_ctrl_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2366,7 +2235,7 @@ func (x *EnvInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use EnvInfo.ProtoReflect.Descriptor instead. func (*EnvInfo) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{28} + return file_edge_ctrl_proto_rawDescGZIP(), []int{24} } func (x *EnvInfo) GetArch() string { @@ -2427,7 +2296,7 @@ type SdkInfo struct { func (x *SdkInfo) Reset() { *x = SdkInfo{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[29] + mi := &file_edge_ctrl_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2440,7 +2309,7 @@ func (x *SdkInfo) String() string { func (*SdkInfo) ProtoMessage() {} func (x *SdkInfo) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[29] + mi := &file_edge_ctrl_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2453,7 +2322,7 @@ func (x *SdkInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use SdkInfo.ProtoReflect.Descriptor instead. func (*SdkInfo) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{29} + return file_edge_ctrl_proto_rawDescGZIP(), []int{25} } func (x *SdkInfo) GetAppId() string { @@ -2511,7 +2380,7 @@ type CreateApiSessionRequest struct { func (x *CreateApiSessionRequest) Reset() { *x = CreateApiSessionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[30] + mi := &file_edge_ctrl_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2524,7 +2393,7 @@ func (x *CreateApiSessionRequest) String() string { func (*CreateApiSessionRequest) ProtoMessage() {} func (x *CreateApiSessionRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[30] + mi := &file_edge_ctrl_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2537,7 +2406,7 @@ func (x *CreateApiSessionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateApiSessionRequest.ProtoReflect.Descriptor instead. func (*CreateApiSessionRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{30} + return file_edge_ctrl_proto_rawDescGZIP(), []int{26} } func (x *CreateApiSessionRequest) GetEnvInfo() *EnvInfo { @@ -2581,7 +2450,7 @@ type CreateApiSessionResponse struct { func (x *CreateApiSessionResponse) Reset() { *x = CreateApiSessionResponse{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[31] + mi := &file_edge_ctrl_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2594,7 +2463,7 @@ func (x *CreateApiSessionResponse) String() string { func (*CreateApiSessionResponse) ProtoMessage() {} func (x *CreateApiSessionResponse) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[31] + mi := &file_edge_ctrl_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2607,7 +2476,7 @@ func (x *CreateApiSessionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateApiSessionResponse.ProtoReflect.Descriptor instead. func (*CreateApiSessionResponse) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{31} + return file_edge_ctrl_proto_rawDescGZIP(), []int{27} } func (x *CreateApiSessionResponse) GetSessionId() string { @@ -2694,7 +2563,7 @@ type CreateCircuitForServiceRequest struct { func (x *CreateCircuitForServiceRequest) Reset() { *x = CreateCircuitForServiceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[32] + mi := &file_edge_ctrl_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2707,7 +2576,7 @@ func (x *CreateCircuitForServiceRequest) String() string { func (*CreateCircuitForServiceRequest) ProtoMessage() {} func (x *CreateCircuitForServiceRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[32] + mi := &file_edge_ctrl_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2720,7 +2589,7 @@ func (x *CreateCircuitForServiceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateCircuitForServiceRequest.ProtoReflect.Descriptor instead. func (*CreateCircuitForServiceRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{32} + return file_edge_ctrl_proto_rawDescGZIP(), []int{28} } func (x *CreateCircuitForServiceRequest) GetSessionId() string { @@ -2763,7 +2632,7 @@ type CreateSessionResponse struct { func (x *CreateSessionResponse) Reset() { *x = CreateSessionResponse{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[33] + mi := &file_edge_ctrl_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2776,7 +2645,7 @@ func (x *CreateSessionResponse) String() string { func (*CreateSessionResponse) ProtoMessage() {} func (x *CreateSessionResponse) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[33] + mi := &file_edge_ctrl_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2789,7 +2658,7 @@ func (x *CreateSessionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateSessionResponse.ProtoReflect.Descriptor instead. func (*CreateSessionResponse) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{33} + return file_edge_ctrl_proto_rawDescGZIP(), []int{29} } func (x *CreateSessionResponse) GetSessionId() string { @@ -2822,7 +2691,7 @@ type CreateCircuitForServiceResponse struct { func (x *CreateCircuitForServiceResponse) Reset() { *x = CreateCircuitForServiceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[34] + mi := &file_edge_ctrl_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2835,7 +2704,7 @@ func (x *CreateCircuitForServiceResponse) String() string { func (*CreateCircuitForServiceResponse) ProtoMessage() {} func (x *CreateCircuitForServiceResponse) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[34] + mi := &file_edge_ctrl_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2848,7 +2717,7 @@ func (x *CreateCircuitForServiceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateCircuitForServiceResponse.ProtoReflect.Descriptor instead. func (*CreateCircuitForServiceResponse) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{34} + return file_edge_ctrl_proto_rawDescGZIP(), []int{30} } func (x *CreateCircuitForServiceResponse) GetApiSession() *CreateApiSessionResponse { @@ -2905,7 +2774,7 @@ type ServicesList struct { func (x *ServicesList) Reset() { *x = ServicesList{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[35] + mi := &file_edge_ctrl_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2918,7 +2787,7 @@ func (x *ServicesList) String() string { func (*ServicesList) ProtoMessage() {} func (x *ServicesList) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[35] + mi := &file_edge_ctrl_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2931,7 +2800,7 @@ func (x *ServicesList) ProtoReflect() protoreflect.Message { // Deprecated: Use ServicesList.ProtoReflect.Descriptor instead. func (*ServicesList) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{35} + return file_edge_ctrl_proto_rawDescGZIP(), []int{31} } func (x *ServicesList) GetLastUpdate() []byte { @@ -2964,7 +2833,7 @@ type TunnelService struct { func (x *TunnelService) Reset() { *x = TunnelService{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[36] + mi := &file_edge_ctrl_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2977,7 +2846,7 @@ func (x *TunnelService) String() string { func (*TunnelService) ProtoMessage() {} func (x *TunnelService) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[36] + mi := &file_edge_ctrl_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2990,7 +2859,7 @@ func (x *TunnelService) ProtoReflect() protoreflect.Message { // Deprecated: Use TunnelService.ProtoReflect.Descriptor instead. func (*TunnelService) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{36} + return file_edge_ctrl_proto_rawDescGZIP(), []int{32} } func (x *TunnelService) GetId() string { @@ -3051,23 +2920,952 @@ type CreateTunnelTerminatorRequest struct { StartTime int64 `protobuf:"varint,9,opt,name=startTime,proto3" json:"startTime,omitempty"` } -func (x *CreateTunnelTerminatorRequest) Reset() { - *x = CreateTunnelTerminatorRequest{} +func (x *CreateTunnelTerminatorRequest) Reset() { + *x = CreateTunnelTerminatorRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateTunnelTerminatorRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateTunnelTerminatorRequest) ProtoMessage() {} + +func (x *CreateTunnelTerminatorRequest) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[33] + 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 CreateTunnelTerminatorRequest.ProtoReflect.Descriptor instead. +func (*CreateTunnelTerminatorRequest) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{33} +} + +func (x *CreateTunnelTerminatorRequest) GetServiceName() string { + if x != nil { + return x.ServiceName + } + return "" +} + +func (x *CreateTunnelTerminatorRequest) GetSessionId() string { + if x != nil { + return x.SessionId + } + return "" +} + +func (x *CreateTunnelTerminatorRequest) GetAddress() string { + if x != nil { + return x.Address + } + return "" +} + +func (x *CreateTunnelTerminatorRequest) GetPeerData() map[uint32][]byte { + if x != nil { + return x.PeerData + } + return nil +} + +func (x *CreateTunnelTerminatorRequest) GetCost() uint32 { + if x != nil { + return x.Cost + } + return 0 +} + +func (x *CreateTunnelTerminatorRequest) GetPrecedence() TerminatorPrecedence { + if x != nil { + return x.Precedence + } + return TerminatorPrecedence_Default +} + +func (x *CreateTunnelTerminatorRequest) GetInstanceId() string { + if x != nil { + return x.InstanceId + } + return "" +} + +func (x *CreateTunnelTerminatorRequest) GetInstanceSecret() []byte { + if x != nil { + return x.InstanceSecret + } + return nil +} + +func (x *CreateTunnelTerminatorRequest) GetStartTime() int64 { + if x != nil { + return x.StartTime + } + return 0 +} + +type CreateTunnelTerminatorResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ApiSession *CreateApiSessionResponse `protobuf:"bytes,1,opt,name=apiSession,proto3" json:"apiSession,omitempty"` + Session *CreateSessionResponse `protobuf:"bytes,2,opt,name=session,proto3" json:"session,omitempty"` + TerminatorId string `protobuf:"bytes,3,opt,name=terminatorId,proto3" json:"terminatorId,omitempty"` + StartTime int64 `protobuf:"varint,4,opt,name=startTime,proto3" json:"startTime,omitempty"` +} + +func (x *CreateTunnelTerminatorResponse) Reset() { + *x = CreateTunnelTerminatorResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateTunnelTerminatorResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateTunnelTerminatorResponse) ProtoMessage() {} + +func (x *CreateTunnelTerminatorResponse) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[34] + 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 CreateTunnelTerminatorResponse.ProtoReflect.Descriptor instead. +func (*CreateTunnelTerminatorResponse) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{34} +} + +func (x *CreateTunnelTerminatorResponse) GetApiSession() *CreateApiSessionResponse { + if x != nil { + return x.ApiSession + } + return nil +} + +func (x *CreateTunnelTerminatorResponse) GetSession() *CreateSessionResponse { + if x != nil { + return x.Session + } + return nil +} + +func (x *CreateTunnelTerminatorResponse) GetTerminatorId() string { + if x != nil { + return x.TerminatorId + } + return "" +} + +func (x *CreateTunnelTerminatorResponse) GetStartTime() int64 { + if x != nil { + return x.StartTime + } + return 0 +} + +type UpdateTunnelTerminatorRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TerminatorId string `protobuf:"bytes,1,opt,name=terminatorId,proto3" json:"terminatorId,omitempty"` + Cost uint32 `protobuf:"varint,2,opt,name=cost,proto3" json:"cost,omitempty"` + Precedence TerminatorPrecedence `protobuf:"varint,3,opt,name=precedence,proto3,enum=ziti.edge_ctrl.pb.TerminatorPrecedence" json:"precedence,omitempty"` + UpdatePrecedence bool `protobuf:"varint,4,opt,name=updatePrecedence,proto3" json:"updatePrecedence,omitempty"` + UpdateCost bool `protobuf:"varint,5,opt,name=updateCost,proto3" json:"updateCost,omitempty"` +} + +func (x *UpdateTunnelTerminatorRequest) Reset() { + *x = UpdateTunnelTerminatorRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateTunnelTerminatorRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateTunnelTerminatorRequest) ProtoMessage() {} + +func (x *UpdateTunnelTerminatorRequest) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[35] + 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 UpdateTunnelTerminatorRequest.ProtoReflect.Descriptor instead. +func (*UpdateTunnelTerminatorRequest) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{35} +} + +func (x *UpdateTunnelTerminatorRequest) GetTerminatorId() string { + if x != nil { + return x.TerminatorId + } + return "" +} + +func (x *UpdateTunnelTerminatorRequest) GetCost() uint32 { + if x != nil { + return x.Cost + } + return 0 +} + +func (x *UpdateTunnelTerminatorRequest) GetPrecedence() TerminatorPrecedence { + if x != nil { + return x.Precedence + } + return TerminatorPrecedence_Default +} + +func (x *UpdateTunnelTerminatorRequest) GetUpdatePrecedence() bool { + if x != nil { + return x.UpdatePrecedence + } + return false +} + +func (x *UpdateTunnelTerminatorRequest) GetUpdateCost() bool { + if x != nil { + return x.UpdateCost + } + return false +} + +type EnrollmentExtendRouterRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClientCertCsr string `protobuf:"bytes,1,opt,name=clientCertCsr,proto3" json:"clientCertCsr,omitempty"` + ServerCertCsr string `protobuf:"bytes,2,opt,name=serverCertCsr,proto3" json:"serverCertCsr,omitempty"` + RequireVerification bool `protobuf:"varint,3,opt,name=requireVerification,proto3" json:"requireVerification,omitempty"` +} + +func (x *EnrollmentExtendRouterRequest) Reset() { + *x = EnrollmentExtendRouterRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnrollmentExtendRouterRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnrollmentExtendRouterRequest) ProtoMessage() {} + +func (x *EnrollmentExtendRouterRequest) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[36] + 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 EnrollmentExtendRouterRequest.ProtoReflect.Descriptor instead. +func (*EnrollmentExtendRouterRequest) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{36} +} + +func (x *EnrollmentExtendRouterRequest) GetClientCertCsr() string { + if x != nil { + return x.ClientCertCsr + } + return "" +} + +func (x *EnrollmentExtendRouterRequest) GetServerCertCsr() string { + if x != nil { + return x.ServerCertCsr + } + return "" +} + +func (x *EnrollmentExtendRouterRequest) GetRequireVerification() bool { + if x != nil { + return x.RequireVerification + } + return false +} + +type EnrollmentCertsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClientCertPem string `protobuf:"bytes,1,opt,name=clientCertPem,proto3" json:"clientCertPem,omitempty"` + ServerCertPem string `protobuf:"bytes,2,opt,name=serverCertPem,proto3" json:"serverCertPem,omitempty"` + CaCertsPem string `protobuf:"bytes,3,opt,name=caCertsPem,proto3" json:"caCertsPem,omitempty"` +} + +func (x *EnrollmentCertsResponse) Reset() { + *x = EnrollmentCertsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnrollmentCertsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnrollmentCertsResponse) ProtoMessage() {} + +func (x *EnrollmentCertsResponse) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[37] + 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 EnrollmentCertsResponse.ProtoReflect.Descriptor instead. +func (*EnrollmentCertsResponse) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{37} +} + +func (x *EnrollmentCertsResponse) GetClientCertPem() string { + if x != nil { + return x.ClientCertPem + } + return "" +} + +func (x *EnrollmentCertsResponse) GetServerCertPem() string { + if x != nil { + return x.ServerCertPem + } + return "" +} + +func (x *EnrollmentCertsResponse) GetCaCertsPem() string { + if x != nil { + return x.CaCertsPem + } + return "" +} + +type EnrollmentExtendRouterVerifyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClientCertPem string `protobuf:"bytes,1,opt,name=clientCertPem,proto3" json:"clientCertPem,omitempty"` +} + +func (x *EnrollmentExtendRouterVerifyRequest) Reset() { + *x = EnrollmentExtendRouterVerifyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnrollmentExtendRouterVerifyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnrollmentExtendRouterVerifyRequest) ProtoMessage() {} + +func (x *EnrollmentExtendRouterVerifyRequest) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[38] + 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 EnrollmentExtendRouterVerifyRequest.ProtoReflect.Descriptor instead. +func (*EnrollmentExtendRouterVerifyRequest) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{38} +} + +func (x *EnrollmentExtendRouterVerifyRequest) GetClientCertPem() string { + if x != nil { + return x.ClientCertPem + } + return "" +} + +type DataState_Identity struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + ServicePolicyIds []string `protobuf:"bytes,3,rep,name=servicePolicyIds,proto3" json:"servicePolicyIds,omitempty"` +} + +func (x *DataState_Identity) Reset() { + *x = DataState_Identity{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DataState_Identity) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataState_Identity) ProtoMessage() {} + +func (x *DataState_Identity) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[42] + 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 DataState_Identity.ProtoReflect.Descriptor instead. +func (*DataState_Identity) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 0} +} + +func (x *DataState_Identity) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *DataState_Identity) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DataState_Identity) GetServicePolicyIds() []string { + if x != nil { + return x.ServicePolicyIds + } + return nil +} + +type DataState_Service struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + EncryptionRequired bool `protobuf:"varint,3,opt,name=encryptionRequired,proto3" json:"encryptionRequired,omitempty"` +} + +func (x *DataState_Service) Reset() { + *x = DataState_Service{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DataState_Service) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataState_Service) ProtoMessage() {} + +func (x *DataState_Service) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[43] + 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 DataState_Service.ProtoReflect.Descriptor instead. +func (*DataState_Service) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 1} +} + +func (x *DataState_Service) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *DataState_Service) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DataState_Service) GetEncryptionRequired() bool { + if x != nil { + return x.EncryptionRequired + } + return false +} + +type DataState_ServicePolicy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + ServiceIds []string `protobuf:"bytes,3,rep,name=serviceIds,proto3" json:"serviceIds,omitempty"` + PostureCheckIds []string `protobuf:"bytes,4,rep,name=postureCheckIds,proto3" json:"postureCheckIds,omitempty"` + IdentityIds []string `protobuf:"bytes,5,rep,name=identityIds,proto3" json:"identityIds,omitempty"` +} + +func (x *DataState_ServicePolicy) Reset() { + *x = DataState_ServicePolicy{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DataState_ServicePolicy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataState_ServicePolicy) ProtoMessage() {} + +func (x *DataState_ServicePolicy) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[44] + 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 DataState_ServicePolicy.ProtoReflect.Descriptor instead. +func (*DataState_ServicePolicy) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 2} +} + +func (x *DataState_ServicePolicy) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *DataState_ServicePolicy) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DataState_ServicePolicy) GetServiceIds() []string { + if x != nil { + return x.ServiceIds + } + return nil +} + +func (x *DataState_ServicePolicy) GetPostureCheckIds() []string { + if x != nil { + return x.PostureCheckIds + } + return nil +} + +func (x *DataState_ServicePolicy) GetIdentityIds() []string { + if x != nil { + return x.IdentityIds + } + return nil +} + +type DataState_Revocation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=ExpiresAt,proto3" json:"ExpiresAt,omitempty"` +} + +func (x *DataState_Revocation) Reset() { + *x = DataState_Revocation{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DataState_Revocation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataState_Revocation) ProtoMessage() {} + +func (x *DataState_Revocation) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[45] + 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 DataState_Revocation.ProtoReflect.Descriptor instead. +func (*DataState_Revocation) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 3} +} + +func (x *DataState_Revocation) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *DataState_Revocation) GetExpiresAt() *timestamppb.Timestamp { + if x != nil { + return x.ExpiresAt + } + return nil +} + +type DataState_Event struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Action DataState_Action `protobuf:"varint,1,opt,name=action,proto3,enum=ziti.edge_ctrl.pb.DataState_Action" json:"action,omitempty"` + Index uint64 `protobuf:"varint,2,opt,name=index,proto3" json:"index,omitempty"` + IsSynthetic bool `protobuf:"varint,3,opt,name=isSynthetic,proto3" json:"isSynthetic,omitempty"` + // Types that are assignable to Model: + // + // *DataState_Event_Identity + // *DataState_Event_Service + // *DataState_Event_ServicePolicy + // *DataState_Event_PostureCheck + // *DataState_Event_PublicKey + // *DataState_Event_Revocation + Model isDataState_Event_Model `protobuf_oneof:"Model"` +} + +func (x *DataState_Event) Reset() { + *x = DataState_Event{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DataState_Event) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataState_Event) ProtoMessage() {} + +func (x *DataState_Event) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[46] + 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 DataState_Event.ProtoReflect.Descriptor instead. +func (*DataState_Event) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 4} +} + +func (x *DataState_Event) GetAction() DataState_Action { + if x != nil { + return x.Action + } + return DataState_Create +} + +func (x *DataState_Event) GetIndex() uint64 { + if x != nil { + return x.Index + } + return 0 +} + +func (x *DataState_Event) GetIsSynthetic() bool { + if x != nil { + return x.IsSynthetic + } + return false +} + +func (m *DataState_Event) GetModel() isDataState_Event_Model { + if m != nil { + return m.Model + } + return nil +} + +func (x *DataState_Event) GetIdentity() *DataState_Identity { + if x, ok := x.GetModel().(*DataState_Event_Identity); ok { + return x.Identity + } + return nil +} + +func (x *DataState_Event) GetService() *DataState_Service { + if x, ok := x.GetModel().(*DataState_Event_Service); ok { + return x.Service + } + return nil +} + +func (x *DataState_Event) GetServicePolicy() *DataState_ServicePolicy { + if x, ok := x.GetModel().(*DataState_Event_ServicePolicy); ok { + return x.ServicePolicy + } + return nil +} + +func (x *DataState_Event) GetPostureCheck() *DataState_PostureCheck { + if x, ok := x.GetModel().(*DataState_Event_PostureCheck); ok { + return x.PostureCheck + } + return nil +} + +func (x *DataState_Event) GetPublicKey() *DataState_PublicKey { + if x, ok := x.GetModel().(*DataState_Event_PublicKey); ok { + return x.PublicKey + } + return nil +} + +func (x *DataState_Event) GetRevocation() *DataState_Revocation { + if x, ok := x.GetModel().(*DataState_Event_Revocation); ok { + return x.Revocation + } + return nil +} + +type isDataState_Event_Model interface { + isDataState_Event_Model() +} + +type DataState_Event_Identity struct { + Identity *DataState_Identity `protobuf:"bytes,10,opt,name=identity,proto3,oneof"` +} + +type DataState_Event_Service struct { + Service *DataState_Service `protobuf:"bytes,11,opt,name=service,proto3,oneof"` +} + +type DataState_Event_ServicePolicy struct { + ServicePolicy *DataState_ServicePolicy `protobuf:"bytes,12,opt,name=servicePolicy,proto3,oneof"` +} + +type DataState_Event_PostureCheck struct { + PostureCheck *DataState_PostureCheck `protobuf:"bytes,13,opt,name=postureCheck,proto3,oneof"` +} + +type DataState_Event_PublicKey struct { + PublicKey *DataState_PublicKey `protobuf:"bytes,14,opt,name=publicKey,proto3,oneof"` +} + +type DataState_Event_Revocation struct { + Revocation *DataState_Revocation `protobuf:"bytes,15,opt,name=revocation,proto3,oneof"` +} + +func (*DataState_Event_Identity) isDataState_Event_Model() {} + +func (*DataState_Event_Service) isDataState_Event_Model() {} + +func (*DataState_Event_ServicePolicy) isDataState_Event_Model() {} + +func (*DataState_Event_PostureCheck) isDataState_Event_Model() {} + +func (*DataState_Event_PublicKey) isDataState_Event_Model() {} + +func (*DataState_Event_Revocation) isDataState_Event_Model() {} + +type DataState_PublicKey struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` //public key + Kid string `protobuf:"bytes,2,opt,name=kid,proto3" json:"kid,omitempty"` //key id/fingerprint + Usages []DataState_PublicKey_Usage `protobuf:"varint,3,rep,packed,name=usages,proto3,enum=ziti.edge_ctrl.pb.DataState_PublicKey_Usage" json:"usages,omitempty"` // what the public key in data is used for + Format DataState_PublicKey_Format `protobuf:"varint,4,opt,name=format,proto3,enum=ziti.edge_ctrl.pb.DataState_PublicKey_Format" json:"format,omitempty"` //the format of the public key in data and chain +} + +func (x *DataState_PublicKey) Reset() { + *x = DataState_PublicKey{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DataState_PublicKey) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataState_PublicKey) ProtoMessage() {} + +func (x *DataState_PublicKey) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[47] + 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 DataState_PublicKey.ProtoReflect.Descriptor instead. +func (*DataState_PublicKey) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 5} +} + +func (x *DataState_PublicKey) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *DataState_PublicKey) GetKid() string { + if x != nil { + return x.Kid + } + return "" +} + +func (x *DataState_PublicKey) GetUsages() []DataState_PublicKey_Usage { + if x != nil { + return x.Usages + } + return nil +} + +func (x *DataState_PublicKey) GetFormat() DataState_PublicKey_Format { + if x != nil { + return x.Format + } + return DataState_PublicKey_X509CertDer +} + +type DataState_PostureCheck struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + TypeId string `protobuf:"bytes,4,opt,name=typeId,proto3" json:"typeId,omitempty"` + // Types that are assignable to Subtype: + // + // *DataState_PostureCheck_Mac_ + // *DataState_PostureCheck_Mfa_ + // *DataState_PostureCheck_OsList_ + // *DataState_PostureCheck_Process_ + // *DataState_PostureCheck_ProcessMulti_ + // *DataState_PostureCheck_Domains_ + Subtype isDataState_PostureCheck_Subtype `protobuf_oneof:"subtype"` +} + +func (x *DataState_PostureCheck) Reset() { + *x = DataState_PostureCheck{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[37] + mi := &file_edge_ctrl_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateTunnelTerminatorRequest) String() string { +func (x *DataState_PostureCheck) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateTunnelTerminatorRequest) ProtoMessage() {} +func (*DataState_PostureCheck) ProtoMessage() {} -func (x *CreateTunnelTerminatorRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[37] +func (x *DataState_PostureCheck) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3078,102 +3876,146 @@ func (x *CreateTunnelTerminatorRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateTunnelTerminatorRequest.ProtoReflect.Descriptor instead. -func (*CreateTunnelTerminatorRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{37} +// Deprecated: Use DataState_PostureCheck.ProtoReflect.Descriptor instead. +func (*DataState_PostureCheck) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 6} } -func (x *CreateTunnelTerminatorRequest) GetServiceName() string { +func (x *DataState_PostureCheck) GetId() string { if x != nil { - return x.ServiceName + return x.Id } return "" } -func (x *CreateTunnelTerminatorRequest) GetSessionId() string { +func (x *DataState_PostureCheck) GetName() string { if x != nil { - return x.SessionId + return x.Name } return "" } -func (x *CreateTunnelTerminatorRequest) GetAddress() string { +func (x *DataState_PostureCheck) GetTypeId() string { if x != nil { - return x.Address + return x.TypeId } return "" } -func (x *CreateTunnelTerminatorRequest) GetPeerData() map[uint32][]byte { - if x != nil { - return x.PeerData +func (m *DataState_PostureCheck) GetSubtype() isDataState_PostureCheck_Subtype { + if m != nil { + return m.Subtype } return nil } -func (x *CreateTunnelTerminatorRequest) GetCost() uint32 { - if x != nil { - return x.Cost +func (x *DataState_PostureCheck) GetMac() *DataState_PostureCheck_Mac { + if x, ok := x.GetSubtype().(*DataState_PostureCheck_Mac_); ok { + return x.Mac } - return 0 + return nil } -func (x *CreateTunnelTerminatorRequest) GetPrecedence() TerminatorPrecedence { - if x != nil { - return x.Precedence +func (x *DataState_PostureCheck) GetMfa() *DataState_PostureCheck_Mfa { + if x, ok := x.GetSubtype().(*DataState_PostureCheck_Mfa_); ok { + return x.Mfa } - return TerminatorPrecedence_Default + return nil } -func (x *CreateTunnelTerminatorRequest) GetInstanceId() string { - if x != nil { - return x.InstanceId +func (x *DataState_PostureCheck) GetOsList() *DataState_PostureCheck_OsList { + if x, ok := x.GetSubtype().(*DataState_PostureCheck_OsList_); ok { + return x.OsList } - return "" + return nil } -func (x *CreateTunnelTerminatorRequest) GetInstanceSecret() []byte { - if x != nil { - return x.InstanceSecret +func (x *DataState_PostureCheck) GetProcess() *DataState_PostureCheck_Process { + if x, ok := x.GetSubtype().(*DataState_PostureCheck_Process_); ok { + return x.Process } return nil } -func (x *CreateTunnelTerminatorRequest) GetStartTime() int64 { - if x != nil { - return x.StartTime +func (x *DataState_PostureCheck) GetProcessMulti() *DataState_PostureCheck_ProcessMulti { + if x, ok := x.GetSubtype().(*DataState_PostureCheck_ProcessMulti_); ok { + return x.ProcessMulti } - return 0 + return nil } -type CreateTunnelTerminatorResponse struct { +func (x *DataState_PostureCheck) GetDomains() *DataState_PostureCheck_Domains { + if x, ok := x.GetSubtype().(*DataState_PostureCheck_Domains_); ok { + return x.Domains + } + return nil +} + +type isDataState_PostureCheck_Subtype interface { + isDataState_PostureCheck_Subtype() +} + +type DataState_PostureCheck_Mac_ struct { + Mac *DataState_PostureCheck_Mac `protobuf:"bytes,7,opt,name=mac,proto3,oneof"` +} + +type DataState_PostureCheck_Mfa_ struct { + Mfa *DataState_PostureCheck_Mfa `protobuf:"bytes,8,opt,name=mfa,proto3,oneof"` +} + +type DataState_PostureCheck_OsList_ struct { + OsList *DataState_PostureCheck_OsList `protobuf:"bytes,9,opt,name=osList,proto3,oneof"` +} + +type DataState_PostureCheck_Process_ struct { + Process *DataState_PostureCheck_Process `protobuf:"bytes,10,opt,name=process,proto3,oneof"` +} + +type DataState_PostureCheck_ProcessMulti_ struct { + ProcessMulti *DataState_PostureCheck_ProcessMulti `protobuf:"bytes,11,opt,name=processMulti,proto3,oneof"` +} + +type DataState_PostureCheck_Domains_ struct { + Domains *DataState_PostureCheck_Domains `protobuf:"bytes,12,opt,name=domains,proto3,oneof"` +} + +func (*DataState_PostureCheck_Mac_) isDataState_PostureCheck_Subtype() {} + +func (*DataState_PostureCheck_Mfa_) isDataState_PostureCheck_Subtype() {} + +func (*DataState_PostureCheck_OsList_) isDataState_PostureCheck_Subtype() {} + +func (*DataState_PostureCheck_Process_) isDataState_PostureCheck_Subtype() {} + +func (*DataState_PostureCheck_ProcessMulti_) isDataState_PostureCheck_Subtype() {} + +func (*DataState_PostureCheck_Domains_) isDataState_PostureCheck_Subtype() {} + +type DataState_PostureCheck_Mac struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ApiSession *CreateApiSessionResponse `protobuf:"bytes,1,opt,name=apiSession,proto3" json:"apiSession,omitempty"` - Session *CreateSessionResponse `protobuf:"bytes,2,opt,name=session,proto3" json:"session,omitempty"` - TerminatorId string `protobuf:"bytes,3,opt,name=terminatorId,proto3" json:"terminatorId,omitempty"` - StartTime int64 `protobuf:"varint,4,opt,name=startTime,proto3" json:"startTime,omitempty"` + MacAddresses []string `protobuf:"bytes,1,rep,name=macAddresses,proto3" json:"macAddresses,omitempty"` } -func (x *CreateTunnelTerminatorResponse) Reset() { - *x = CreateTunnelTerminatorResponse{} +func (x *DataState_PostureCheck_Mac) Reset() { + *x = DataState_PostureCheck_Mac{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[38] + mi := &file_edge_ctrl_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateTunnelTerminatorResponse) String() string { +func (x *DataState_PostureCheck_Mac) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateTunnelTerminatorResponse) ProtoMessage() {} +func (*DataState_PostureCheck_Mac) ProtoMessage() {} -func (x *CreateTunnelTerminatorResponse) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[38] +func (x *DataState_PostureCheck_Mac) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3184,68 +4026,115 @@ func (x *CreateTunnelTerminatorResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateTunnelTerminatorResponse.ProtoReflect.Descriptor instead. -func (*CreateTunnelTerminatorResponse) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{38} +// Deprecated: Use DataState_PostureCheck_Mac.ProtoReflect.Descriptor instead. +func (*DataState_PostureCheck_Mac) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 6, 0} } -func (x *CreateTunnelTerminatorResponse) GetApiSession() *CreateApiSessionResponse { +func (x *DataState_PostureCheck_Mac) GetMacAddresses() []string { if x != nil { - return x.ApiSession + return x.MacAddresses } return nil } -func (x *CreateTunnelTerminatorResponse) GetSession() *CreateSessionResponse { +type DataState_PostureCheck_Mfa struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TimeoutSeconds int64 `protobuf:"varint,1,opt,name=TimeoutSeconds,proto3" json:"TimeoutSeconds,omitempty"` + PromptOnWake bool `protobuf:"varint,2,opt,name=PromptOnWake,proto3" json:"PromptOnWake,omitempty"` + PromptOnUnlock bool `protobuf:"varint,3,opt,name=PromptOnUnlock,proto3" json:"PromptOnUnlock,omitempty"` + IgnoreLegacyEndpoints bool `protobuf:"varint,4,opt,name=IgnoreLegacyEndpoints,proto3" json:"IgnoreLegacyEndpoints,omitempty"` +} + +func (x *DataState_PostureCheck_Mfa) Reset() { + *x = DataState_PostureCheck_Mfa{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DataState_PostureCheck_Mfa) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataState_PostureCheck_Mfa) ProtoMessage() {} + +func (x *DataState_PostureCheck_Mfa) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[50] + 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 DataState_PostureCheck_Mfa.ProtoReflect.Descriptor instead. +func (*DataState_PostureCheck_Mfa) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 6, 1} +} + +func (x *DataState_PostureCheck_Mfa) GetTimeoutSeconds() int64 { if x != nil { - return x.Session + return x.TimeoutSeconds } - return nil + return 0 } -func (x *CreateTunnelTerminatorResponse) GetTerminatorId() string { +func (x *DataState_PostureCheck_Mfa) GetPromptOnWake() bool { if x != nil { - return x.TerminatorId + return x.PromptOnWake } - return "" + return false } -func (x *CreateTunnelTerminatorResponse) GetStartTime() int64 { +func (x *DataState_PostureCheck_Mfa) GetPromptOnUnlock() bool { if x != nil { - return x.StartTime + return x.PromptOnUnlock } - return 0 + return false } -type UpdateTunnelTerminatorRequest struct { +func (x *DataState_PostureCheck_Mfa) GetIgnoreLegacyEndpoints() bool { + if x != nil { + return x.IgnoreLegacyEndpoints + } + return false +} + +type DataState_PostureCheck_Os struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TerminatorId string `protobuf:"bytes,1,opt,name=terminatorId,proto3" json:"terminatorId,omitempty"` - Cost uint32 `protobuf:"varint,2,opt,name=cost,proto3" json:"cost,omitempty"` - Precedence TerminatorPrecedence `protobuf:"varint,3,opt,name=precedence,proto3,enum=ziti.edge_ctrl.pb.TerminatorPrecedence" json:"precedence,omitempty"` - UpdatePrecedence bool `protobuf:"varint,4,opt,name=updatePrecedence,proto3" json:"updatePrecedence,omitempty"` - UpdateCost bool `protobuf:"varint,5,opt,name=updateCost,proto3" json:"updateCost,omitempty"` + OsType string `protobuf:"bytes,1,opt,name=OsType,proto3" json:"OsType,omitempty"` + OsVersions []string `protobuf:"bytes,2,rep,name=OsVersions,proto3" json:"OsVersions,omitempty"` } -func (x *UpdateTunnelTerminatorRequest) Reset() { - *x = UpdateTunnelTerminatorRequest{} +func (x *DataState_PostureCheck_Os) Reset() { + *x = DataState_PostureCheck_Os{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[39] + mi := &file_edge_ctrl_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateTunnelTerminatorRequest) String() string { +func (x *DataState_PostureCheck_Os) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateTunnelTerminatorRequest) ProtoMessage() {} +func (*DataState_PostureCheck_Os) ProtoMessage() {} -func (x *UpdateTunnelTerminatorRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[39] +func (x *DataState_PostureCheck_Os) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3256,73 +4145,100 @@ func (x *UpdateTunnelTerminatorRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateTunnelTerminatorRequest.ProtoReflect.Descriptor instead. -func (*UpdateTunnelTerminatorRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{39} +// Deprecated: Use DataState_PostureCheck_Os.ProtoReflect.Descriptor instead. +func (*DataState_PostureCheck_Os) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 6, 2} } -func (x *UpdateTunnelTerminatorRequest) GetTerminatorId() string { +func (x *DataState_PostureCheck_Os) GetOsType() string { if x != nil { - return x.TerminatorId + return x.OsType } return "" } -func (x *UpdateTunnelTerminatorRequest) GetCost() uint32 { +func (x *DataState_PostureCheck_Os) GetOsVersions() []string { if x != nil { - return x.Cost + return x.OsVersions } - return 0 + return nil } -func (x *UpdateTunnelTerminatorRequest) GetPrecedence() TerminatorPrecedence { - if x != nil { - return x.Precedence +type DataState_PostureCheck_OsList struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + OsList []*DataState_PostureCheck_Os `protobuf:"bytes,1,rep,name=osList,proto3" json:"osList,omitempty"` +} + +func (x *DataState_PostureCheck_OsList) Reset() { + *x = DataState_PostureCheck_OsList{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_ctrl_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return TerminatorPrecedence_Default } -func (x *UpdateTunnelTerminatorRequest) GetUpdatePrecedence() bool { - if x != nil { - return x.UpdatePrecedence +func (x *DataState_PostureCheck_OsList) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataState_PostureCheck_OsList) ProtoMessage() {} + +func (x *DataState_PostureCheck_OsList) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[52] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return false + return mi.MessageOf(x) } -func (x *UpdateTunnelTerminatorRequest) GetUpdateCost() bool { +// Deprecated: Use DataState_PostureCheck_OsList.ProtoReflect.Descriptor instead. +func (*DataState_PostureCheck_OsList) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 6, 3} +} + +func (x *DataState_PostureCheck_OsList) GetOsList() []*DataState_PostureCheck_Os { if x != nil { - return x.UpdateCost + return x.OsList } - return false + return nil } -type EnrollmentExtendRouterRequest struct { +type DataState_PostureCheck_Process struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClientCertCsr string `protobuf:"bytes,1,opt,name=clientCertCsr,proto3" json:"clientCertCsr,omitempty"` - ServerCertCsr string `protobuf:"bytes,2,opt,name=serverCertCsr,proto3" json:"serverCertCsr,omitempty"` - RequireVerification bool `protobuf:"varint,3,opt,name=requireVerification,proto3" json:"requireVerification,omitempty"` + OsType string `protobuf:"bytes,1,opt,name=OsType,proto3" json:"OsType,omitempty"` + Path string `protobuf:"bytes,2,opt,name=Path,proto3" json:"Path,omitempty"` + Hashes []string `protobuf:"bytes,3,rep,name=Hashes,proto3" json:"Hashes,omitempty"` + Fingerprints []string `protobuf:"bytes,4,rep,name=Fingerprints,proto3" json:"Fingerprints,omitempty"` } -func (x *EnrollmentExtendRouterRequest) Reset() { - *x = EnrollmentExtendRouterRequest{} +func (x *DataState_PostureCheck_Process) Reset() { + *x = DataState_PostureCheck_Process{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[40] + mi := &file_edge_ctrl_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *EnrollmentExtendRouterRequest) String() string { +func (x *DataState_PostureCheck_Process) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EnrollmentExtendRouterRequest) ProtoMessage() {} +func (*DataState_PostureCheck_Process) ProtoMessage() {} -func (x *EnrollmentExtendRouterRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[40] +func (x *DataState_PostureCheck_Process) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3333,59 +4249,65 @@ func (x *EnrollmentExtendRouterRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use EnrollmentExtendRouterRequest.ProtoReflect.Descriptor instead. -func (*EnrollmentExtendRouterRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{40} +// Deprecated: Use DataState_PostureCheck_Process.ProtoReflect.Descriptor instead. +func (*DataState_PostureCheck_Process) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 6, 4} } -func (x *EnrollmentExtendRouterRequest) GetClientCertCsr() string { +func (x *DataState_PostureCheck_Process) GetOsType() string { if x != nil { - return x.ClientCertCsr + return x.OsType } return "" } -func (x *EnrollmentExtendRouterRequest) GetServerCertCsr() string { +func (x *DataState_PostureCheck_Process) GetPath() string { if x != nil { - return x.ServerCertCsr + return x.Path } return "" } -func (x *EnrollmentExtendRouterRequest) GetRequireVerification() bool { +func (x *DataState_PostureCheck_Process) GetHashes() []string { if x != nil { - return x.RequireVerification + return x.Hashes } - return false + return nil } -type EnrollmentCertsResponse struct { +func (x *DataState_PostureCheck_Process) GetFingerprints() []string { + if x != nil { + return x.Fingerprints + } + return nil +} + +type DataState_PostureCheck_ProcessMulti struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClientCertPem string `protobuf:"bytes,1,opt,name=clientCertPem,proto3" json:"clientCertPem,omitempty"` - ServerCertPem string `protobuf:"bytes,2,opt,name=serverCertPem,proto3" json:"serverCertPem,omitempty"` - CaCertsPem string `protobuf:"bytes,3,opt,name=caCertsPem,proto3" json:"caCertsPem,omitempty"` + Semantic string `protobuf:"bytes,1,opt,name=semantic,proto3" json:"semantic,omitempty"` + Processes []*DataState_PostureCheck_Process `protobuf:"bytes,2,rep,name=processes,proto3" json:"processes,omitempty"` } -func (x *EnrollmentCertsResponse) Reset() { - *x = EnrollmentCertsResponse{} +func (x *DataState_PostureCheck_ProcessMulti) Reset() { + *x = DataState_PostureCheck_ProcessMulti{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[41] + mi := &file_edge_ctrl_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *EnrollmentCertsResponse) String() string { +func (x *DataState_PostureCheck_ProcessMulti) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EnrollmentCertsResponse) ProtoMessage() {} +func (*DataState_PostureCheck_ProcessMulti) ProtoMessage() {} -func (x *EnrollmentCertsResponse) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[41] +func (x *DataState_PostureCheck_ProcessMulti) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3396,57 +4318,50 @@ func (x *EnrollmentCertsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use EnrollmentCertsResponse.ProtoReflect.Descriptor instead. -func (*EnrollmentCertsResponse) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{41} -} - -func (x *EnrollmentCertsResponse) GetClientCertPem() string { - if x != nil { - return x.ClientCertPem - } - return "" +// Deprecated: Use DataState_PostureCheck_ProcessMulti.ProtoReflect.Descriptor instead. +func (*DataState_PostureCheck_ProcessMulti) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 6, 5} } -func (x *EnrollmentCertsResponse) GetServerCertPem() string { +func (x *DataState_PostureCheck_ProcessMulti) GetSemantic() string { if x != nil { - return x.ServerCertPem + return x.Semantic } return "" } -func (x *EnrollmentCertsResponse) GetCaCertsPem() string { +func (x *DataState_PostureCheck_ProcessMulti) GetProcesses() []*DataState_PostureCheck_Process { if x != nil { - return x.CaCertsPem + return x.Processes } - return "" + return nil } -type EnrollmentExtendRouterVerifyRequest struct { +type DataState_PostureCheck_Domains struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClientCertPem string `protobuf:"bytes,1,opt,name=clientCertPem,proto3" json:"clientCertPem,omitempty"` + Domains []string `protobuf:"bytes,1,rep,name=domains,proto3" json:"domains,omitempty"` } -func (x *EnrollmentExtendRouterVerifyRequest) Reset() { - *x = EnrollmentExtendRouterVerifyRequest{} +func (x *DataState_PostureCheck_Domains) Reset() { + *x = DataState_PostureCheck_Domains{} if protoimpl.UnsafeEnabled { - mi := &file_edge_ctrl_proto_msgTypes[42] + mi := &file_edge_ctrl_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *EnrollmentExtendRouterVerifyRequest) String() string { +func (x *DataState_PostureCheck_Domains) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EnrollmentExtendRouterVerifyRequest) ProtoMessage() {} +func (*DataState_PostureCheck_Domains) ProtoMessage() {} -func (x *EnrollmentExtendRouterVerifyRequest) ProtoReflect() protoreflect.Message { - mi := &file_edge_ctrl_proto_msgTypes[42] +func (x *DataState_PostureCheck_Domains) ProtoReflect() protoreflect.Message { + mi := &file_edge_ctrl_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3457,677 +4372,816 @@ func (x *EnrollmentExtendRouterVerifyRequest) ProtoReflect() protoreflect.Messag return mi.MessageOf(x) } -// Deprecated: Use EnrollmentExtendRouterVerifyRequest.ProtoReflect.Descriptor instead. -func (*EnrollmentExtendRouterVerifyRequest) Descriptor() ([]byte, []int) { - return file_edge_ctrl_proto_rawDescGZIP(), []int{42} +// Deprecated: Use DataState_PostureCheck_Domains.ProtoReflect.Descriptor instead. +func (*DataState_PostureCheck_Domains) Descriptor() ([]byte, []int) { + return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 6, 6} } -func (x *EnrollmentExtendRouterVerifyRequest) GetClientCertPem() string { +func (x *DataState_PostureCheck_Domains) GetDomains() []string { if x != nil { - return x.ClientCertPem + return x.Domains } - return "" + return nil } var File_edge_ctrl_proto protoreflect.FileDescriptor var file_edge_ctrl_proto_rawDesc = []byte{ - 0x0a, 0x0f, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x12, 0x11, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, - 0x6c, 0x2e, 0x70, 0x62, 0x22, 0xa5, 0x02, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, - 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3c, - 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x7a, - 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x48, 0x0a, 0x08, - 0x62, 0x79, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, - 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, - 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, 0x42, - 0x79, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x62, 0x79, - 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x3b, 0x0a, 0x0d, 0x42, 0x79, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x07, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, - 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, - 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x28, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x7a, 0x0a, 0x08, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, - 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x61, - 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, - 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x09, 0x61, 0x64, 0x76, 0x65, - 0x72, 0x74, 0x69, 0x73, 0x65, 0x22, 0xb9, 0x02, 0x0a, 0x0b, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x0a, 0x0f, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x11, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, + 0x6c, 0x2e, 0x70, 0x62, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa5, 0x02, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x12, 0x3c, 0x0a, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, - 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x39, 0x0a, - 0x09, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, - 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x6c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x4b, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, 0x5d, - 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, - 0x12, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x6e, 0x63, 0x72, 0x79, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0xfe, 0x02, - 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x63, - 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x63, 0x49, 0x64, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x31, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, - 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, - 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x4b, 0x65, 0x79, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x4b, - 0x65, 0x79, 0x73, 0x12, 0x3b, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, - 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, - 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, - 0x12, 0x36, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, - 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x0a, 0x70, 0x6f, 0x73, 0x74, - 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x7a, + 0x3c, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, + 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x48, 0x0a, + 0x08, 0x62, 0x79, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2c, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, + 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, + 0x42, 0x79, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x62, + 0x79, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x3b, 0x0a, 0x0d, 0x42, 0x79, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, + 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, + 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, + 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x28, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x7a, 0x0a, 0x08, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, + 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x38, 0x0a, 0x09, + 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, + 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x09, 0x61, 0x64, 0x76, + 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x22, 0xb9, 0x02, 0x0a, 0x0b, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x12, 0x3c, 0x0a, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, + 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x39, + 0x0a, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, + 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x09, + 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x44, 0x61, 0x74, + 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x4b, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x63, + 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, + 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, + 0x5d, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2e, + 0x0a, 0x12, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x6e, 0x63, 0x72, + 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0xdc, + 0x14, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3a, 0x0a, 0x06, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, - 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x0a, 0x70, 0x6f, 0x73, - 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x12, 0x45, 0x0a, 0x0d, 0x70, 0x6f, 0x73, 0x74, 0x75, - 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, - 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, - 0x0d, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x22, 0x21, - 0x0a, 0x0b, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x73, 0x12, 0x12, 0x0a, - 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x04, 0x6b, 0x65, 0x79, - 0x73, 0x22, 0x4e, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, - 0x73, 0x22, 0x5a, 0x0a, 0x0a, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x12, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x1a, 0x5a, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x73, + 0x1a, 0x5d, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x2e, 0x0a, 0x12, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x6e, 0x63, + 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x1a, + 0x9f, 0x01, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x64, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, + 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x64, 0x73, 0x12, + 0x20, 0x0a, 0x0b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, + 0x73, 0x1a, 0x56, 0x0a, 0x0a, 0x52, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x6f, - 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x64, 0x73, 0x22, 0xaa, 0x01, - 0x0a, 0x0c, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x3d, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x29, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, - 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfd, 0x01, 0x0a, 0x07, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x32, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x7a, 0x69, 0x74, - 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x65, 0x72, 0x74, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, - 0x69, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x63, 0x65, 0x72, 0x74, - 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, - 0x75, 0x72, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x75, 0x72, 0x6c, 0x73, - 0x12, 0x34, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, - 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x70, - 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x5e, 0x0a, 0x0a, 0x41, 0x70, - 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2a, - 0x0a, 0x10, 0x63, 0x65, 0x72, 0x74, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x63, 0x65, 0x72, 0x74, 0x46, 0x69, - 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x74, 0x0a, 0x0f, 0x41, 0x70, - 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x65, 0x64, 0x12, 0x20, 0x0a, - 0x0b, 0x69, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x3f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, - 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0x54, 0x0a, 0x11, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x7a, 0x69, 0x74, - 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x41, - 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x61, 0x70, 0x69, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3d, 0x0a, 0x11, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x2d, 0x0a, 0x13, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x73, 0x22, 0x3a, 0x0a, 0x0e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x10, - 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, - 0x22, 0x2d, 0x0a, 0x13, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, - 0xa2, 0x02, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, - 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, - 0x12, 0x32, 0x0a, 0x14, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, - 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, - 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x38, 0x0a, 0x09, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x1a, 0xc4, 0x04, 0x0a, 0x05, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, + 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x73, 0x53, 0x79, 0x6e, 0x74, + 0x68, 0x65, 0x74, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x53, + 0x79, 0x6e, 0x74, 0x68, 0x65, 0x74, 0x69, 0x63, 0x12, 0x43, 0x0a, 0x08, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x7a, 0x69, 0x74, + 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x48, 0x00, 0x52, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x40, 0x0a, + 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, + 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, + 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x52, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, + 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x48, 0x00, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x4f, 0x0a, 0x0c, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x7a, 0x69, 0x74, 0x69, + 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x48, 0x00, 0x52, 0x0c, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x12, 0x46, 0x0a, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, + 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, + 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x48, + 0x00, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x49, 0x0a, 0x0a, + 0x72, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, + 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, + 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x72, 0x65, 0x76, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x07, 0x0a, 0x05, 0x4d, 0x6f, 0x64, 0x65, 0x6c, + 0x1a, 0xa6, 0x02, 0x0a, 0x09, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x12, + 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x69, 0x64, 0x12, 0x44, 0x0a, 0x06, 0x75, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, + 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x2e, 0x55, 0x73, 0x61, + 0x67, 0x65, 0x52, 0x06, 0x75, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x7a, 0x69, 0x74, + 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, + 0x65, 0x79, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x38, 0x0a, 0x05, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x4a, 0x57, + 0x54, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x1c, 0x0a, + 0x18, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x58, 0x35, 0x30, 0x39, 0x43, 0x65, 0x72, 0x74, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x01, 0x22, 0x2c, 0x0a, 0x06, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0f, 0x0a, 0x0b, 0x58, 0x35, 0x30, 0x39, 0x43, 0x65, 0x72, + 0x74, 0x44, 0x65, 0x72, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x4b, 0x49, 0x58, 0x50, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x10, 0x01, 0x1a, 0xa3, 0x09, 0x0a, 0x0c, 0x50, 0x6f, + 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x74, 0x79, 0x70, 0x65, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x79, 0x70, 0x65, 0x49, 0x64, 0x12, 0x41, 0x0a, 0x03, 0x6d, 0x61, 0x63, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, + 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x4d, + 0x61, 0x63, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x63, 0x12, 0x41, 0x0a, 0x03, 0x6d, 0x66, 0x61, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, + 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x2e, 0x4d, 0x66, 0x61, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x66, 0x61, 0x12, 0x4a, 0x0a, 0x06, + 0x6f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x7a, + 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, + 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x4f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, + 0x52, 0x06, 0x6f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x4d, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x7a, 0x69, 0x74, 0x69, + 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x07, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x5c, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, + 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, + 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, + 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x48, 0x00, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x12, 0x4d, 0x0a, 0x07, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, + 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x07, 0x64, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x73, 0x1a, 0x29, 0x0a, 0x03, 0x4d, 0x61, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x6d, + 0x61, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, + 0xaf, 0x01, 0x0a, 0x03, 0x4d, 0x66, 0x61, 0x12, 0x26, 0x0a, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, + 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x57, 0x61, 0x6b, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x57, + 0x61, 0x6b, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x55, + 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x50, 0x72, 0x6f, + 0x6d, 0x70, 0x74, 0x4f, 0x6e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x34, 0x0a, 0x15, 0x49, + 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x45, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x49, 0x67, 0x6e, 0x6f, + 0x72, 0x65, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x73, 0x1a, 0x3c, 0x0a, 0x02, 0x4f, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x73, 0x54, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x1e, 0x0a, 0x0a, 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0a, 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, + 0x4e, 0x0a, 0x06, 0x4f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x44, 0x0a, 0x06, 0x6f, 0x73, 0x4c, + 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x7a, 0x69, 0x74, 0x69, + 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x4f, 0x73, 0x52, 0x06, 0x6f, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x1a, + 0x71, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x73, + 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x73, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x22, + 0x0a, 0x0c, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, + 0x74, 0x73, 0x1a, 0x7b, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x75, 0x6c, + 0x74, 0x69, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x12, 0x4f, + 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x31, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, + 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, + 0x50, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x50, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, + 0x23, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x64, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x2c, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x10, + 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x10, 0x02, 0x22, 0xfd, 0x01, + 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, + 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, + 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x65, 0x72, 0x74, 0x46, 0x69, 0x6e, 0x67, 0x65, + 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x63, + 0x65, 0x72, 0x74, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, + 0x12, 0x0a, 0x04, 0x75, 0x72, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x75, + 0x72, 0x6c, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, + 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x70, 0x69, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x5e, 0x0a, + 0x0a, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x65, 0x72, 0x74, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, + 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x63, 0x65, 0x72, + 0x74, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x74, 0x0a, + 0x0f, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x65, 0x64, + 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, + 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x70, 0x69, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x54, 0x0a, 0x11, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, + 0x62, 0x2e, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x61, 0x70, + 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3d, 0x0a, 0x11, 0x41, 0x70, 0x69, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x16, + 0x0a, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x2d, 0x0a, 0x13, 0x41, 0x70, 0x69, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0x3a, 0x0a, 0x0e, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x73, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, + 0x69, 0x64, 0x73, 0x22, 0x2d, 0x0a, 0x13, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x22, 0xcc, 0x02, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, + 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, + 0x6e, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x14, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, + 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x14, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, + 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x7a, 0x69, 0x74, 0x69, + 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x70, + 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0xe1, 0x02, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, + 0x75, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, + 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x52, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, + 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, - 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, - 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe1, 0x02, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, - 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x52, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, - 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, - 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x46, 0x0a, 0x04, 0x74, 0x61, - 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, - 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, - 0x67, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, + 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x46, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, + 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, + 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, + 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc3, 0x03, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, + 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6e, + 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x54, 0x0a, 0x08, 0x70, 0x65, 0x65, + 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x7a, 0x69, + 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, + 0x6f, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, + 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, + 0x52, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, + 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x1a, 0x3b, + 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe1, 0x03, 0x0a, 0x19, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, + 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, + 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, + 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x56, 0x0a, 0x08, 0x70, + 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, + 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x6f, 0x72, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, 0x72, + 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, + 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, + 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, + 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, + 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, + 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, + 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x70, 0x69, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x99, 0x03, 0x0a, 0x17, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, - 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, - 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x54, 0x0a, 0x08, - 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, - 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, - 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, - 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x95, 0x01, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x61, 0x74, 0x6f, 0x72, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, + 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, + 0x49, 0x64, 0x12, 0x41, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, + 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x22, 0xaf, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, + 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, + 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x74, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, + 0x28, 0x0a, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xd8, 0x02, 0x0a, 0x17, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, + 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x22, 0x0a, + 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, + 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, + 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, + 0x63, 0x65, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2a, + 0x0a, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, + 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x70, + 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xcc, 0x01, 0x0a, 0x12, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, + 0x6e, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, + 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x50, 0x61, 0x73, 0x73, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x50, 0x61, 0x73, 0x73, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x70, 0x69, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x22, 0x3f, 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, + 0x0a, 0x0d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x73, 0x22, 0x9d, 0x01, 0x0a, 0x07, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x61, 0x72, 0x63, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x4f, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x73, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x73, 0x52, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x22, 0xa1, 0x01, 0x0a, 0x07, 0x53, 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x14, 0x0a, 0x05, 0x41, 0x70, 0x70, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x41, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x41, 0x70, 0x70, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x1a, + 0x0a, 0x08, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, + 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa7, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x07, 0x65, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, + 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x07, 0x65, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x34, 0x0a, 0x07, 0x73, 0x64, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, + 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, + 0x53, 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x73, 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, 0x70, + 0x65, 0x73, 0x22, 0x8a, 0x06, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x36, 0x0a, 0x16, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x16, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x63, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, + 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, + 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x18, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, + 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, + 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x43, 0x6f, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x44, 0x61, 0x74, 0x61, 0x4a, + 0x73, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x70, 0x70, 0x44, 0x61, + 0x74, 0x61, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x73, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, + 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x61, 0x0a, 0x0c, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x3d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, + 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x1a, 0x6e, + 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, + 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3d, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, - 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, - 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, - 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, - 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb7, 0x03, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, - 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x22, 0x0a, 0x0c, - 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, - 0x69, 0x6e, 0x74, 0x73, 0x12, 0x56, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, + 0x6e, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, + 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0xae, 0x02, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, + 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x14, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x14, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x5b, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, + 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, + 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, 0x72, + 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, + 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x4b, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x90, 0x04, + 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, + 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x4b, 0x0a, 0x0a, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, + 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x42, + 0x0a, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x28, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, + 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x5c, 0x0a, 0x08, 0x70, 0x65, + 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x7a, + 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, + 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x50, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x32, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, - 0x63, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, - 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, - 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x70, - 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x95, - 0x01, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x6f, 0x72, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, - 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, - 0x64, 0x12, 0x41, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x29, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, - 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, - 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x22, 0x85, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, - 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, - 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x65, - 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0xae, - 0x02, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x22, - 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, - 0x74, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, - 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, - 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x04, + 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, + 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x6c, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, + 0x12, 0x1e, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x12, 0x3c, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, + 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0xa1, + 0x01, 0x0a, 0x0d, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x6e, 0x63, 0x72, + 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x74, 0x61, + 0x67, 0x73, 0x22, 0xd5, 0x03, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, + 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x5a, + 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x3e, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, + 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, + 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, + 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x47, + 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, + 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, + 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x70, 0x72, 0x65, + 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x1a, 0x3b, 0x0a, + 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf3, 0x01, 0x0a, 0x1e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, + 0x0a, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2b, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, + 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, + 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x07, 0x73, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x7a, 0x69, + 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, + 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, + 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, + 0x22, 0xec, 0x01, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, + 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x72, - 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, + 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, - 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x75, + 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, - 0x1e, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x18, 0x07, 0x20, + 0x1e, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x22, - 0xa2, 0x01, 0x0a, 0x12, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, - 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x22, - 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, - 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x61, 0x73, 0x73, 0x65, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x61, - 0x73, 0x73, 0x65, 0x64, 0x22, 0x3f, 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x24, 0x0a, 0x0d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0x9d, 0x01, 0x0a, 0x07, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x61, 0x72, 0x63, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x4f, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x73, 0x52, 0x65, 0x6c, 0x65, 0x61, - 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x73, 0x52, 0x65, 0x6c, 0x65, - 0x61, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0xa1, 0x01, 0x0a, 0x07, 0x53, 0x64, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x70, 0x70, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x41, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x70, 0x70, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x41, 0x70, 0x70, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x42, 0x72, 0x61, 0x6e, 0x63, - 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, - 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa7, 0x01, 0x0a, 0x17, 0x43, 0x72, + 0x9d, 0x01, 0x0a, 0x1d, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x43, + 0x73, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x43, 0x65, 0x72, 0x74, 0x43, 0x73, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x43, 0x65, 0x72, 0x74, 0x43, 0x73, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x43, 0x73, 0x72, 0x12, 0x30, 0x0a, + 0x13, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x85, 0x01, 0x0a, 0x17, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x65, + 0x72, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, + 0x6d, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x50, + 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x43, 0x65, 0x72, + 0x74, 0x73, 0x50, 0x65, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x43, + 0x65, 0x72, 0x74, 0x73, 0x50, 0x65, 0x6d, 0x22, 0x4b, 0x0a, 0x23, 0x45, 0x6e, 0x72, 0x6f, 0x6c, + 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x72, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, + 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, + 0x74, 0x50, 0x65, 0x6d, 0x2a, 0x9e, 0x0b, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x15, + 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x79, 0x70, + 0x65, 0x10, 0xa0, 0x9c, 0x01, 0x12, 0x15, 0x0a, 0x0f, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, + 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x10, 0xa1, 0x9c, 0x01, 0x12, 0x0f, 0x0a, 0x09, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x10, 0xa2, 0x9c, 0x01, 0x12, 0x18, 0x0a, + 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x54, + 0x79, 0x70, 0x65, 0x10, 0x86, 0x9d, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x41, 0x70, 0x69, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x10, 0xe8, + 0x9d, 0x01, 0x12, 0x1b, 0x0a, 0x15, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x10, 0xe9, 0x9d, 0x01, 0x12, + 0x1b, 0x0a, 0x15, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x10, 0xea, 0x9d, 0x01, 0x12, 0x1d, 0x0a, 0x17, + 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, + 0x65, 0x61, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xeb, 0x9d, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x53, 0x79, + 0x6e, 0x63, 0x54, 0x79, 0x70, 0x65, 0x10, 0xec, 0x9d, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xed, 0x9d, 0x01, 0x12, 0x1f, 0x0a, 0x19, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xee, 0x9d, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xef, 0x9d, 0x01, 0x12, 0x22, + 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf0, + 0x9d, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x10, 0xf1, 0x9d, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf2, 0x9d, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf3, 0x9d, 0x01, 0x12, 0x22, 0x0a, 0x1c, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf4, 0x9d, 0x01, + 0x12, 0x21, 0x0a, 0x1b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, + 0xf5, 0x9d, 0x01, 0x12, 0x15, 0x0a, 0x0f, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf6, 0x9d, 0x01, 0x12, 0x23, 0x0a, 0x1d, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x32, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf8, 0x9d, 0x01, 0x12, + 0x24, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, + 0x74, 0x6f, 0x72, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x10, 0xf9, 0x9d, 0x01, 0x12, 0x20, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, + 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x10, 0xfa, 0x9d, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xfb, 0x9d, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x45, 0x6e, + 0x72, 0x6f, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x10, 0xcc, 0x9e, 0x01, 0x12, 0x21, 0x0a, 0x1b, + 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xcd, 0x9e, 0x01, 0x12, + 0x27, 0x0a, 0x21, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x10, 0xce, 0x9e, 0x01, 0x12, 0x2d, 0x0a, 0x27, 0x45, 0x6e, 0x72, 0x6f, + 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x52, 0x6f, 0x75, 0x74, + 0x65, 0x72, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x10, 0xcf, 0x9e, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb0, 0x9f, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x07, 0x65, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, - 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x07, 0x65, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x34, 0x0a, 0x07, 0x73, - 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x7a, - 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, - 0x2e, 0x53, 0x64, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x73, 0x64, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, - 0x70, 0x65, 0x73, 0x22, 0x8a, 0x06, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, - 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x36, 0x0a, 0x16, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x1e, 0x0a, 0x0a, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x63, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, - 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, - 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x18, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x63, 0x65, - 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x44, 0x61, 0x74, 0x61, - 0x4a, 0x73, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x70, 0x70, 0x44, - 0x61, 0x74, 0x61, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x73, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x09, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, - 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, - 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, - 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x61, 0x0a, 0x0c, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, - 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x1a, - 0x6e, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, - 0x65, 0x6e, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3d, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, - 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, - 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, - 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x3f, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0xae, 0x02, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, - 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x14, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, - 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x14, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x5b, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, - 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x7a, 0x69, 0x74, 0x69, - 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, - 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, - 0x44, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x4b, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x90, - 0x04, 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, - 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0a, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, - 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x42, 0x0a, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x28, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, - 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x49, - 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x5c, 0x0a, 0x08, 0x70, - 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, - 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, - 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x50, 0x0a, 0x04, 0x74, 0x61, 0x67, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, - 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb1, 0x9f, 0x01, 0x12, 0x28, + 0x0a, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, + 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x10, 0xb2, 0x9f, 0x01, 0x12, 0x29, 0x0a, 0x23, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x67, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, - 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x6c, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x4c, 0x69, 0x73, - 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x12, 0x3c, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, - 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, - 0xa1, 0x01, 0x0a, 0x0d, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x6e, 0x63, 0x72, 0x79, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x6e, 0x63, - 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x74, - 0x61, 0x67, 0x73, 0x22, 0xd5, 0x03, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, - 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x5a, 0x0a, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x3e, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, - 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, - 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x63, - 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, - 0x47, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, - 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, - 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x70, 0x72, - 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x1a, 0x3b, - 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf3, 0x01, 0x0a, 0x1e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, - 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, - 0x0a, 0x0a, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, - 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x69, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, - 0x0a, 0x61, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x07, 0x73, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x7a, - 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x2e, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x22, 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, - 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x22, 0xec, 0x01, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, - 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, - 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x72, 0x6d, 0x69, - 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x70, - 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x27, 0x2e, 0x7a, 0x69, 0x74, 0x69, 0x2e, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, - 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, - 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, - 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, - 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, - 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x73, 0x74, - 0x22, 0x9d, 0x01, 0x0a, 0x1d, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, - 0x43, 0x73, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x43, 0x65, 0x72, 0x74, 0x43, 0x73, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x43, 0x73, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x43, 0x73, 0x72, 0x12, 0x30, - 0x0a, 0x13, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x72, 0x65, 0x71, - 0x75, 0x69, 0x72, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x85, 0x01, 0x0a, 0x17, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x43, - 0x65, 0x72, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x50, - 0x65, 0x6d, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, - 0x50, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x43, 0x65, - 0x72, 0x74, 0x73, 0x50, 0x65, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, - 0x43, 0x65, 0x72, 0x74, 0x73, 0x50, 0x65, 0x6d, 0x22, 0x4b, 0x0a, 0x23, 0x45, 0x6e, 0x72, 0x6f, - 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x52, 0x6f, 0x75, 0x74, - 0x65, 0x72, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x24, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x50, 0x65, 0x6d, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, - 0x72, 0x74, 0x50, 0x65, 0x6d, 0x2a, 0xf4, 0x0a, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, - 0x15, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x79, - 0x70, 0x65, 0x10, 0xa0, 0x9c, 0x01, 0x12, 0x15, 0x0a, 0x0f, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x10, 0xa1, 0x9c, 0x01, 0x12, 0x0f, 0x0a, - 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x10, 0xa2, 0x9c, 0x01, 0x12, 0x18, - 0x0a, 0x12, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, - 0x54, 0x79, 0x70, 0x65, 0x10, 0x86, 0x9d, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x41, 0x70, 0x69, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x10, - 0xe8, 0x9d, 0x01, 0x12, 0x1b, 0x0a, 0x15, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x10, 0xe9, 0x9d, 0x01, - 0x12, 0x1b, 0x0a, 0x15, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x10, 0xea, 0x9d, 0x01, 0x12, 0x1d, 0x0a, - 0x17, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x72, 0x74, - 0x62, 0x65, 0x61, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xeb, 0x9d, 0x01, 0x12, 0x1d, 0x0a, 0x17, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x53, - 0x79, 0x6e, 0x63, 0x54, 0x79, 0x70, 0x65, 0x10, 0xec, 0x9d, 0x01, 0x12, 0x1e, 0x0a, 0x18, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xed, 0x9d, 0x01, 0x12, 0x1f, 0x0a, 0x19, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xee, 0x9d, 0x01, 0x12, 0x21, 0x0a, 0x1b, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xef, 0x9d, 0x01, 0x12, - 0x22, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, - 0xf0, 0x9d, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, - 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x10, 0xf1, 0x9d, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf2, 0x9d, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf3, 0x9d, 0x01, 0x12, 0x22, 0x0a, - 0x1c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf4, 0x9d, - 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x10, 0xf5, 0x9d, 0x01, 0x12, 0x15, 0x0a, 0x0f, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf6, 0x9d, 0x01, 0x12, 0x1a, 0x0a, 0x14, 0x53, - 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x41, 0x64, 0x64, 0x65, 0x64, 0x54, - 0x79, 0x70, 0x65, 0x10, 0xf7, 0x9d, 0x01, 0x12, 0x23, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x32, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf8, 0x9d, 0x01, 0x12, 0x24, 0x0a, 0x1e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, - 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xf9, - 0x9d, 0x01, 0x12, 0x20, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, - 0x75, 0x69, 0x74, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x10, 0xfa, 0x9d, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, - 0x72, 0x63, 0x75, 0x69, 0x74, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x10, 0xfb, 0x9d, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x45, 0x6e, 0x72, 0x6f, 0x6c, - 0x6c, 0x54, 0x79, 0x70, 0x65, 0x10, 0xcc, 0x9e, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x45, 0x6e, 0x72, - 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xcd, 0x9e, 0x01, 0x12, 0x27, 0x0a, 0x21, - 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, - 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x10, 0xce, 0x9e, 0x01, 0x12, 0x2d, 0x0a, 0x27, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, - 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x10, 0xcf, 0x9e, 0x01, 0x12, 0x21, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, - 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, - 0x79, 0x70, 0x65, 0x10, 0xb0, 0x9f, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x41, 0x70, 0x69, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb1, 0x9f, 0x01, 0x12, 0x28, 0x0a, 0x22, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x10, 0xb2, 0x9f, 0x01, 0x12, 0x29, 0x0a, 0x23, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, - 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb3, 0x9f, 0x01, - 0x12, 0x1d, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb4, 0x9f, 0x01, 0x12, - 0x15, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x10, 0xb5, 0x9f, 0x01, 0x12, 0x27, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb6, 0x9f, 0x01, 0x12, - 0x28, 0x0a, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, - 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb7, 0x9f, 0x01, 0x12, 0x27, 0x0a, 0x21, 0x55, 0x70, 0x64, + 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, + 0xb3, 0x9f, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb4, + 0x9f, 0x01, 0x12, 0x15, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb5, 0x9f, 0x01, 0x12, 0x27, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb8, - 0x9f, 0x01, 0x12, 0x28, 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, + 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb6, + 0x9f, 0x01, 0x12, 0x28, 0x0a, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb9, 0x9f, 0x01, 0x12, 0x27, 0x0a, 0x21, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, + 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb7, 0x9f, 0x01, 0x12, 0x27, 0x0a, 0x21, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x10, 0xba, 0x9f, 0x01, 0x12, 0x28, 0x0a, 0x22, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, + 0x65, 0x10, 0xb8, 0x9f, 0x01, 0x12, 0x28, 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xbb, 0x9f, 0x01, 0x12, - 0x1b, 0x0a, 0x15, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xbc, 0x9f, 0x01, 0x2a, 0x21, 0x0a, 0x0b, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x44, - 0x69, 0x61, 0x6c, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x69, 0x6e, 0x64, 0x10, 0x01, 0x2a, - 0x3d, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x0a, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0c, 0x54, 0x65, 0x72, - 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x10, 0xfe, 0x07, 0x12, 0x10, 0x0a, 0x0b, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x61, 0x73, 0x73, 0x65, 0x64, 0x10, 0xff, 0x07, 0x2a, 0x2e, - 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, - 0x41, 0x64, 0x64, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x10, - 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x10, 0x02, 0x2a, 0x3d, - 0x0a, 0x14, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, - 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x10, - 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x02, 0x2a, 0x76, 0x0a, - 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, - 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x49, 0x64, - 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x46, - 0x61, 0x69, 0x6c, 0x65, 0x64, 0x42, 0x75, 0x73, 0x79, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x46, - 0x61, 0x69, 0x6c, 0x65, 0x64, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x10, 0x04, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x7a, 0x69, 0x74, 0x69, 0x2f, 0x65, 0x64, 0x67, - 0x65, 0x2f, 0x70, 0x62, 0x2f, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x5f, 0x70, - 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xb9, 0x9f, 0x01, 0x12, + 0x27, 0x0a, 0x21, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x10, 0xba, 0x9f, 0x01, 0x12, 0x28, 0x0a, 0x22, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x10, 0xbb, + 0x9f, 0x01, 0x12, 0x1b, 0x0a, 0x15, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0xbc, 0x9f, 0x01, 0x12, + 0x13, 0x0a, 0x0d, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x10, 0x94, 0xa0, 0x01, 0x12, 0x18, 0x0a, 0x12, 0x44, 0x61, 0x74, 0x61, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x10, 0x95, 0xa0, 0x01, 0x12, 0x15, + 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, + 0x65, 0x10, 0x96, 0xa0, 0x01, 0x2a, 0x21, 0x0a, 0x0b, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x69, 0x61, 0x6c, 0x10, 0x00, 0x12, 0x08, + 0x0a, 0x04, 0x42, 0x69, 0x6e, 0x64, 0x10, 0x01, 0x2a, 0x6e, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5a, 0x65, 0x72, 0x6f, + 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, + 0x49, 0x64, 0x10, 0xfe, 0x07, 0x12, 0x10, 0x0a, 0x0b, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x61, + 0x73, 0x73, 0x65, 0x64, 0x10, 0xff, 0x07, 0x12, 0x14, 0x0a, 0x0f, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x72, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x10, 0x80, 0x08, 0x12, 0x19, 0x0a, + 0x14, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x10, 0x81, 0x08, 0x2a, 0x3d, 0x0a, 0x14, 0x54, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, + 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12, 0x0c, 0x0a, + 0x08, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x02, 0x2a, 0x76, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, 0x12, 0x14, + 0x0a, 0x10, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x49, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, + 0x63, 0x74, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x74, + 0x68, 0x65, 0x72, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x42, + 0x75, 0x73, 0x79, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x49, + 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x04, 0x42, + 0x31, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, + 0x65, 0x6e, 0x7a, 0x69, 0x74, 0x69, 0x2f, 0x7a, 0x69, 0x74, 0x69, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2f, 0x70, 0x62, 0x2f, 0x65, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x74, 0x72, 0x6c, 0x5f, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4142,122 +5196,147 @@ func file_edge_ctrl_proto_rawDescGZIP() []byte { return file_edge_ctrl_proto_rawDescData } -var file_edge_ctrl_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_edge_ctrl_proto_msgTypes = make([]protoimpl.MessageInfo, 58) +var file_edge_ctrl_proto_enumTypes = make([]protoimpl.EnumInfo, 8) +var file_edge_ctrl_proto_msgTypes = make([]protoimpl.MessageInfo, 67) var file_edge_ctrl_proto_goTypes = []interface{}{ (ContentType)(0), // 0: ziti.edge_ctrl.pb.ContentType (SessionType)(0), // 1: ziti.edge_ctrl.pb.SessionType (Header)(0), // 2: ziti.edge_ctrl.pb.Header - (ConfigType)(0), // 3: ziti.edge_ctrl.pb.ConfigType - (TerminatorPrecedence)(0), // 4: ziti.edge_ctrl.pb.TerminatorPrecedence - (CreateTerminatorResult)(0), // 5: ziti.edge_ctrl.pb.CreateTerminatorResult - (*ServerHello)(nil), // 6: ziti.edge_ctrl.pb.ServerHello - (*Address)(nil), // 7: ziti.edge_ctrl.pb.Address - (*Listener)(nil), // 8: ziti.edge_ctrl.pb.Listener - (*ClientHello)(nil), // 9: ziti.edge_ctrl.pb.ClientHello - (*Error)(nil), // 10: ziti.edge_ctrl.pb.Error - (*Service)(nil), // 11: ziti.edge_ctrl.pb.Service - (*Config)(nil), // 12: ziti.edge_ctrl.pb.Config - (*SignerCerts)(nil), // 13: ziti.edge_ctrl.pb.SignerCerts - (*Identity)(nil), // 14: ziti.edge_ctrl.pb.Identity - (*PostureSet)(nil), // 15: ziti.edge_ctrl.pb.PostureSet - (*PostureCheck)(nil), // 16: ziti.edge_ctrl.pb.PostureCheck - (*Session)(nil), // 17: ziti.edge_ctrl.pb.Session - (*ApiSession)(nil), // 18: ziti.edge_ctrl.pb.ApiSession - (*ApiSessionAdded)(nil), // 19: ziti.edge_ctrl.pb.ApiSessionAdded - (*ApiSessionUpdated)(nil), // 20: ziti.edge_ctrl.pb.ApiSessionUpdated - (*ApiSessionRemoved)(nil), // 21: ziti.edge_ctrl.pb.ApiSessionRemoved - (*ApiSessionHeartbeat)(nil), // 22: ziti.edge_ctrl.pb.ApiSessionHeartbeat - (*SessionRemoved)(nil), // 23: ziti.edge_ctrl.pb.SessionRemoved - (*RequestClientReSync)(nil), // 24: ziti.edge_ctrl.pb.RequestClientReSync - (*CreateCircuitRequest)(nil), // 25: ziti.edge_ctrl.pb.CreateCircuitRequest - (*CreateCircuitResponse)(nil), // 26: ziti.edge_ctrl.pb.CreateCircuitResponse - (*CreateTerminatorRequest)(nil), // 27: ziti.edge_ctrl.pb.CreateTerminatorRequest - (*CreateTerminatorV2Request)(nil), // 28: ziti.edge_ctrl.pb.CreateTerminatorV2Request - (*CreateTerminatorV2Response)(nil), // 29: ziti.edge_ctrl.pb.CreateTerminatorV2Response - (*RemoveTerminatorRequest)(nil), // 30: ziti.edge_ctrl.pb.RemoveTerminatorRequest - (*UpdateTerminatorRequest)(nil), // 31: ziti.edge_ctrl.pb.UpdateTerminatorRequest - (*HealthEventRequest)(nil), // 32: ziti.edge_ctrl.pb.HealthEventRequest - (*ValidateSessionsRequest)(nil), // 33: ziti.edge_ctrl.pb.ValidateSessionsRequest - (*EnvInfo)(nil), // 34: ziti.edge_ctrl.pb.EnvInfo - (*SdkInfo)(nil), // 35: ziti.edge_ctrl.pb.SdkInfo - (*CreateApiSessionRequest)(nil), // 36: ziti.edge_ctrl.pb.CreateApiSessionRequest - (*CreateApiSessionResponse)(nil), // 37: ziti.edge_ctrl.pb.CreateApiSessionResponse - (*CreateCircuitForServiceRequest)(nil), // 38: ziti.edge_ctrl.pb.CreateCircuitForServiceRequest - (*CreateSessionResponse)(nil), // 39: ziti.edge_ctrl.pb.CreateSessionResponse - (*CreateCircuitForServiceResponse)(nil), // 40: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse - (*ServicesList)(nil), // 41: ziti.edge_ctrl.pb.ServicesList - (*TunnelService)(nil), // 42: ziti.edge_ctrl.pb.TunnelService - (*CreateTunnelTerminatorRequest)(nil), // 43: ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest - (*CreateTunnelTerminatorResponse)(nil), // 44: ziti.edge_ctrl.pb.CreateTunnelTerminatorResponse - (*UpdateTunnelTerminatorRequest)(nil), // 45: ziti.edge_ctrl.pb.UpdateTunnelTerminatorRequest - (*EnrollmentExtendRouterRequest)(nil), // 46: ziti.edge_ctrl.pb.EnrollmentExtendRouterRequest - (*EnrollmentCertsResponse)(nil), // 47: ziti.edge_ctrl.pb.EnrollmentCertsResponse - (*EnrollmentExtendRouterVerifyRequest)(nil), // 48: ziti.edge_ctrl.pb.EnrollmentExtendRouterVerifyRequest - nil, // 49: ziti.edge_ctrl.pb.ServerHello.DataEntry - nil, // 50: ziti.edge_ctrl.pb.ServerHello.ByteDataEntry - nil, // 51: ziti.edge_ctrl.pb.ClientHello.DataEntry - nil, // 52: ziti.edge_ctrl.pb.PostureCheck.DataEntry - nil, // 53: ziti.edge_ctrl.pb.CreateCircuitRequest.PeerDataEntry - nil, // 54: ziti.edge_ctrl.pb.CreateCircuitResponse.PeerDataEntry - nil, // 55: ziti.edge_ctrl.pb.CreateCircuitResponse.TagsEntry - nil, // 56: ziti.edge_ctrl.pb.CreateTerminatorRequest.PeerDataEntry - nil, // 57: ziti.edge_ctrl.pb.CreateTerminatorV2Request.PeerDataEntry - nil, // 58: ziti.edge_ctrl.pb.CreateApiSessionResponse.ServicePrecedencesEntry - nil, // 59: ziti.edge_ctrl.pb.CreateApiSessionResponse.ServiceCostsEntry - nil, // 60: ziti.edge_ctrl.pb.CreateCircuitForServiceRequest.PeerDataEntry - nil, // 61: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.PeerDataEntry - nil, // 62: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.TagsEntry - nil, // 63: ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest.PeerDataEntry + (TerminatorPrecedence)(0), // 3: ziti.edge_ctrl.pb.TerminatorPrecedence + (CreateTerminatorResult)(0), // 4: ziti.edge_ctrl.pb.CreateTerminatorResult + (DataState_Action)(0), // 5: ziti.edge_ctrl.pb.DataState.Action + (DataState_PublicKey_Usage)(0), // 6: ziti.edge_ctrl.pb.DataState.PublicKey.Usage + (DataState_PublicKey_Format)(0), // 7: ziti.edge_ctrl.pb.DataState.PublicKey.Format + (*ServerHello)(nil), // 8: ziti.edge_ctrl.pb.ServerHello + (*Address)(nil), // 9: ziti.edge_ctrl.pb.Address + (*Listener)(nil), // 10: ziti.edge_ctrl.pb.Listener + (*ClientHello)(nil), // 11: ziti.edge_ctrl.pb.ClientHello + (*Error)(nil), // 12: ziti.edge_ctrl.pb.Error + (*Service)(nil), // 13: ziti.edge_ctrl.pb.Service + (*DataState)(nil), // 14: ziti.edge_ctrl.pb.DataState + (*Session)(nil), // 15: ziti.edge_ctrl.pb.Session + (*ApiSession)(nil), // 16: ziti.edge_ctrl.pb.ApiSession + (*ApiSessionAdded)(nil), // 17: ziti.edge_ctrl.pb.ApiSessionAdded + (*ApiSessionUpdated)(nil), // 18: ziti.edge_ctrl.pb.ApiSessionUpdated + (*ApiSessionRemoved)(nil), // 19: ziti.edge_ctrl.pb.ApiSessionRemoved + (*ApiSessionHeartbeat)(nil), // 20: ziti.edge_ctrl.pb.ApiSessionHeartbeat + (*SessionRemoved)(nil), // 21: ziti.edge_ctrl.pb.SessionRemoved + (*RequestClientReSync)(nil), // 22: ziti.edge_ctrl.pb.RequestClientReSync + (*CreateCircuitRequest)(nil), // 23: ziti.edge_ctrl.pb.CreateCircuitRequest + (*CreateCircuitResponse)(nil), // 24: ziti.edge_ctrl.pb.CreateCircuitResponse + (*CreateTerminatorRequest)(nil), // 25: ziti.edge_ctrl.pb.CreateTerminatorRequest + (*CreateTerminatorV2Request)(nil), // 26: ziti.edge_ctrl.pb.CreateTerminatorV2Request + (*CreateTerminatorV2Response)(nil), // 27: ziti.edge_ctrl.pb.CreateTerminatorV2Response + (*RemoveTerminatorRequest)(nil), // 28: ziti.edge_ctrl.pb.RemoveTerminatorRequest + (*UpdateTerminatorRequest)(nil), // 29: ziti.edge_ctrl.pb.UpdateTerminatorRequest + (*HealthEventRequest)(nil), // 30: ziti.edge_ctrl.pb.HealthEventRequest + (*ValidateSessionsRequest)(nil), // 31: ziti.edge_ctrl.pb.ValidateSessionsRequest + (*EnvInfo)(nil), // 32: ziti.edge_ctrl.pb.EnvInfo + (*SdkInfo)(nil), // 33: ziti.edge_ctrl.pb.SdkInfo + (*CreateApiSessionRequest)(nil), // 34: ziti.edge_ctrl.pb.CreateApiSessionRequest + (*CreateApiSessionResponse)(nil), // 35: ziti.edge_ctrl.pb.CreateApiSessionResponse + (*CreateCircuitForServiceRequest)(nil), // 36: ziti.edge_ctrl.pb.CreateCircuitForServiceRequest + (*CreateSessionResponse)(nil), // 37: ziti.edge_ctrl.pb.CreateSessionResponse + (*CreateCircuitForServiceResponse)(nil), // 38: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse + (*ServicesList)(nil), // 39: ziti.edge_ctrl.pb.ServicesList + (*TunnelService)(nil), // 40: ziti.edge_ctrl.pb.TunnelService + (*CreateTunnelTerminatorRequest)(nil), // 41: ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest + (*CreateTunnelTerminatorResponse)(nil), // 42: ziti.edge_ctrl.pb.CreateTunnelTerminatorResponse + (*UpdateTunnelTerminatorRequest)(nil), // 43: ziti.edge_ctrl.pb.UpdateTunnelTerminatorRequest + (*EnrollmentExtendRouterRequest)(nil), // 44: ziti.edge_ctrl.pb.EnrollmentExtendRouterRequest + (*EnrollmentCertsResponse)(nil), // 45: ziti.edge_ctrl.pb.EnrollmentCertsResponse + (*EnrollmentExtendRouterVerifyRequest)(nil), // 46: ziti.edge_ctrl.pb.EnrollmentExtendRouterVerifyRequest + nil, // 47: ziti.edge_ctrl.pb.ServerHello.DataEntry + nil, // 48: ziti.edge_ctrl.pb.ServerHello.ByteDataEntry + nil, // 49: ziti.edge_ctrl.pb.ClientHello.DataEntry + (*DataState_Identity)(nil), // 50: ziti.edge_ctrl.pb.DataState.Identity + (*DataState_Service)(nil), // 51: ziti.edge_ctrl.pb.DataState.Service + (*DataState_ServicePolicy)(nil), // 52: ziti.edge_ctrl.pb.DataState.ServicePolicy + (*DataState_Revocation)(nil), // 53: ziti.edge_ctrl.pb.DataState.Revocation + (*DataState_Event)(nil), // 54: ziti.edge_ctrl.pb.DataState.Event + (*DataState_PublicKey)(nil), // 55: ziti.edge_ctrl.pb.DataState.PublicKey + (*DataState_PostureCheck)(nil), // 56: ziti.edge_ctrl.pb.DataState.PostureCheck + (*DataState_PostureCheck_Mac)(nil), // 57: ziti.edge_ctrl.pb.DataState.PostureCheck.Mac + (*DataState_PostureCheck_Mfa)(nil), // 58: ziti.edge_ctrl.pb.DataState.PostureCheck.Mfa + (*DataState_PostureCheck_Os)(nil), // 59: ziti.edge_ctrl.pb.DataState.PostureCheck.Os + (*DataState_PostureCheck_OsList)(nil), // 60: ziti.edge_ctrl.pb.DataState.PostureCheck.OsList + (*DataState_PostureCheck_Process)(nil), // 61: ziti.edge_ctrl.pb.DataState.PostureCheck.Process + (*DataState_PostureCheck_ProcessMulti)(nil), // 62: ziti.edge_ctrl.pb.DataState.PostureCheck.ProcessMulti + (*DataState_PostureCheck_Domains)(nil), // 63: ziti.edge_ctrl.pb.DataState.PostureCheck.Domains + nil, // 64: ziti.edge_ctrl.pb.CreateCircuitRequest.PeerDataEntry + nil, // 65: ziti.edge_ctrl.pb.CreateCircuitResponse.PeerDataEntry + nil, // 66: ziti.edge_ctrl.pb.CreateCircuitResponse.TagsEntry + nil, // 67: ziti.edge_ctrl.pb.CreateTerminatorRequest.PeerDataEntry + nil, // 68: ziti.edge_ctrl.pb.CreateTerminatorV2Request.PeerDataEntry + nil, // 69: ziti.edge_ctrl.pb.CreateApiSessionResponse.ServicePrecedencesEntry + nil, // 70: ziti.edge_ctrl.pb.CreateApiSessionResponse.ServiceCostsEntry + nil, // 71: ziti.edge_ctrl.pb.CreateCircuitForServiceRequest.PeerDataEntry + nil, // 72: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.PeerDataEntry + nil, // 73: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.TagsEntry + nil, // 74: ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest.PeerDataEntry + (*timestamppb.Timestamp)(nil), // 75: google.protobuf.Timestamp } var file_edge_ctrl_proto_depIdxs = []int32{ - 49, // 0: ziti.edge_ctrl.pb.ServerHello.data:type_name -> ziti.edge_ctrl.pb.ServerHello.DataEntry - 50, // 1: ziti.edge_ctrl.pb.ServerHello.byteData:type_name -> ziti.edge_ctrl.pb.ServerHello.ByteDataEntry - 7, // 2: ziti.edge_ctrl.pb.Listener.address:type_name -> ziti.edge_ctrl.pb.Address - 7, // 3: ziti.edge_ctrl.pb.Listener.advertise:type_name -> ziti.edge_ctrl.pb.Address - 51, // 4: ziti.edge_ctrl.pb.ClientHello.data:type_name -> ziti.edge_ctrl.pb.ClientHello.DataEntry - 8, // 5: ziti.edge_ctrl.pb.ClientHello.listeners:type_name -> ziti.edge_ctrl.pb.Listener - 3, // 6: ziti.edge_ctrl.pb.Config.type:type_name -> ziti.edge_ctrl.pb.ConfigType - 14, // 7: ziti.edge_ctrl.pb.Config.identities:type_name -> ziti.edge_ctrl.pb.Identity - 11, // 8: ziti.edge_ctrl.pb.Config.services:type_name -> ziti.edge_ctrl.pb.Service - 15, // 9: ziti.edge_ctrl.pb.Config.postureSet:type_name -> ziti.edge_ctrl.pb.PostureSet - 16, // 10: ziti.edge_ctrl.pb.Config.postureChecks:type_name -> ziti.edge_ctrl.pb.PostureCheck - 52, // 11: ziti.edge_ctrl.pb.PostureCheck.data:type_name -> ziti.edge_ctrl.pb.PostureCheck.DataEntry - 1, // 12: ziti.edge_ctrl.pb.Session.type:type_name -> ziti.edge_ctrl.pb.SessionType - 11, // 13: ziti.edge_ctrl.pb.Session.service:type_name -> ziti.edge_ctrl.pb.Service - 18, // 14: ziti.edge_ctrl.pb.ApiSessionAdded.apiSessions:type_name -> ziti.edge_ctrl.pb.ApiSession - 18, // 15: ziti.edge_ctrl.pb.ApiSessionUpdated.apiSessions:type_name -> ziti.edge_ctrl.pb.ApiSession - 53, // 16: ziti.edge_ctrl.pb.CreateCircuitRequest.peerData:type_name -> ziti.edge_ctrl.pb.CreateCircuitRequest.PeerDataEntry - 54, // 17: ziti.edge_ctrl.pb.CreateCircuitResponse.peerData:type_name -> ziti.edge_ctrl.pb.CreateCircuitResponse.PeerDataEntry - 55, // 18: ziti.edge_ctrl.pb.CreateCircuitResponse.tags:type_name -> ziti.edge_ctrl.pb.CreateCircuitResponse.TagsEntry - 56, // 19: ziti.edge_ctrl.pb.CreateTerminatorRequest.peerData:type_name -> ziti.edge_ctrl.pb.CreateTerminatorRequest.PeerDataEntry - 4, // 20: ziti.edge_ctrl.pb.CreateTerminatorRequest.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence - 57, // 21: ziti.edge_ctrl.pb.CreateTerminatorV2Request.peerData:type_name -> ziti.edge_ctrl.pb.CreateTerminatorV2Request.PeerDataEntry - 4, // 22: ziti.edge_ctrl.pb.CreateTerminatorV2Request.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence - 5, // 23: ziti.edge_ctrl.pb.CreateTerminatorV2Response.result:type_name -> ziti.edge_ctrl.pb.CreateTerminatorResult - 4, // 24: ziti.edge_ctrl.pb.UpdateTerminatorRequest.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence - 34, // 25: ziti.edge_ctrl.pb.CreateApiSessionRequest.envInfo:type_name -> ziti.edge_ctrl.pb.EnvInfo - 35, // 26: ziti.edge_ctrl.pb.CreateApiSessionRequest.sdkInfo:type_name -> ziti.edge_ctrl.pb.SdkInfo - 4, // 27: ziti.edge_ctrl.pb.CreateApiSessionResponse.defaultHostingPrecedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence - 58, // 28: ziti.edge_ctrl.pb.CreateApiSessionResponse.servicePrecedences:type_name -> ziti.edge_ctrl.pb.CreateApiSessionResponse.ServicePrecedencesEntry - 59, // 29: ziti.edge_ctrl.pb.CreateApiSessionResponse.serviceCosts:type_name -> ziti.edge_ctrl.pb.CreateApiSessionResponse.ServiceCostsEntry - 60, // 30: ziti.edge_ctrl.pb.CreateCircuitForServiceRequest.peerData:type_name -> ziti.edge_ctrl.pb.CreateCircuitForServiceRequest.PeerDataEntry - 37, // 31: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.apiSession:type_name -> ziti.edge_ctrl.pb.CreateApiSessionResponse - 39, // 32: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.session:type_name -> ziti.edge_ctrl.pb.CreateSessionResponse - 61, // 33: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.peerData:type_name -> ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.PeerDataEntry - 62, // 34: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.tags:type_name -> ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.TagsEntry - 42, // 35: ziti.edge_ctrl.pb.ServicesList.services:type_name -> ziti.edge_ctrl.pb.TunnelService - 63, // 36: ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest.peerData:type_name -> ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest.PeerDataEntry - 4, // 37: ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence - 37, // 38: ziti.edge_ctrl.pb.CreateTunnelTerminatorResponse.apiSession:type_name -> ziti.edge_ctrl.pb.CreateApiSessionResponse - 39, // 39: ziti.edge_ctrl.pb.CreateTunnelTerminatorResponse.session:type_name -> ziti.edge_ctrl.pb.CreateSessionResponse - 4, // 40: ziti.edge_ctrl.pb.UpdateTunnelTerminatorRequest.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence - 4, // 41: ziti.edge_ctrl.pb.CreateApiSessionResponse.ServicePrecedencesEntry.value:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence - 42, // [42:42] is the sub-list for method output_type - 42, // [42:42] is the sub-list for method input_type - 42, // [42:42] is the sub-list for extension type_name - 42, // [42:42] is the sub-list for extension extendee - 0, // [0:42] is the sub-list for field type_name + 47, // 0: ziti.edge_ctrl.pb.ServerHello.data:type_name -> ziti.edge_ctrl.pb.ServerHello.DataEntry + 48, // 1: ziti.edge_ctrl.pb.ServerHello.byteData:type_name -> ziti.edge_ctrl.pb.ServerHello.ByteDataEntry + 9, // 2: ziti.edge_ctrl.pb.Listener.address:type_name -> ziti.edge_ctrl.pb.Address + 9, // 3: ziti.edge_ctrl.pb.Listener.advertise:type_name -> ziti.edge_ctrl.pb.Address + 49, // 4: ziti.edge_ctrl.pb.ClientHello.data:type_name -> ziti.edge_ctrl.pb.ClientHello.DataEntry + 10, // 5: ziti.edge_ctrl.pb.ClientHello.listeners:type_name -> ziti.edge_ctrl.pb.Listener + 54, // 6: ziti.edge_ctrl.pb.DataState.events:type_name -> ziti.edge_ctrl.pb.DataState.Event + 1, // 7: ziti.edge_ctrl.pb.Session.type:type_name -> ziti.edge_ctrl.pb.SessionType + 13, // 8: ziti.edge_ctrl.pb.Session.service:type_name -> ziti.edge_ctrl.pb.Service + 16, // 9: ziti.edge_ctrl.pb.ApiSessionAdded.apiSessions:type_name -> ziti.edge_ctrl.pb.ApiSession + 16, // 10: ziti.edge_ctrl.pb.ApiSessionUpdated.apiSessions:type_name -> ziti.edge_ctrl.pb.ApiSession + 64, // 11: ziti.edge_ctrl.pb.CreateCircuitRequest.peerData:type_name -> ziti.edge_ctrl.pb.CreateCircuitRequest.PeerDataEntry + 65, // 12: ziti.edge_ctrl.pb.CreateCircuitResponse.peerData:type_name -> ziti.edge_ctrl.pb.CreateCircuitResponse.PeerDataEntry + 66, // 13: ziti.edge_ctrl.pb.CreateCircuitResponse.tags:type_name -> ziti.edge_ctrl.pb.CreateCircuitResponse.TagsEntry + 67, // 14: ziti.edge_ctrl.pb.CreateTerminatorRequest.peerData:type_name -> ziti.edge_ctrl.pb.CreateTerminatorRequest.PeerDataEntry + 3, // 15: ziti.edge_ctrl.pb.CreateTerminatorRequest.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence + 68, // 16: ziti.edge_ctrl.pb.CreateTerminatorV2Request.peerData:type_name -> ziti.edge_ctrl.pb.CreateTerminatorV2Request.PeerDataEntry + 3, // 17: ziti.edge_ctrl.pb.CreateTerminatorV2Request.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence + 4, // 18: ziti.edge_ctrl.pb.CreateTerminatorV2Response.result:type_name -> ziti.edge_ctrl.pb.CreateTerminatorResult + 3, // 19: ziti.edge_ctrl.pb.UpdateTerminatorRequest.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence + 32, // 20: ziti.edge_ctrl.pb.CreateApiSessionRequest.envInfo:type_name -> ziti.edge_ctrl.pb.EnvInfo + 33, // 21: ziti.edge_ctrl.pb.CreateApiSessionRequest.sdkInfo:type_name -> ziti.edge_ctrl.pb.SdkInfo + 3, // 22: ziti.edge_ctrl.pb.CreateApiSessionResponse.defaultHostingPrecedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence + 69, // 23: ziti.edge_ctrl.pb.CreateApiSessionResponse.servicePrecedences:type_name -> ziti.edge_ctrl.pb.CreateApiSessionResponse.ServicePrecedencesEntry + 70, // 24: ziti.edge_ctrl.pb.CreateApiSessionResponse.serviceCosts:type_name -> ziti.edge_ctrl.pb.CreateApiSessionResponse.ServiceCostsEntry + 71, // 25: ziti.edge_ctrl.pb.CreateCircuitForServiceRequest.peerData:type_name -> ziti.edge_ctrl.pb.CreateCircuitForServiceRequest.PeerDataEntry + 35, // 26: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.apiSession:type_name -> ziti.edge_ctrl.pb.CreateApiSessionResponse + 37, // 27: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.session:type_name -> ziti.edge_ctrl.pb.CreateSessionResponse + 72, // 28: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.peerData:type_name -> ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.PeerDataEntry + 73, // 29: ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.tags:type_name -> ziti.edge_ctrl.pb.CreateCircuitForServiceResponse.TagsEntry + 40, // 30: ziti.edge_ctrl.pb.ServicesList.services:type_name -> ziti.edge_ctrl.pb.TunnelService + 74, // 31: ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest.peerData:type_name -> ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest.PeerDataEntry + 3, // 32: ziti.edge_ctrl.pb.CreateTunnelTerminatorRequest.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence + 35, // 33: ziti.edge_ctrl.pb.CreateTunnelTerminatorResponse.apiSession:type_name -> ziti.edge_ctrl.pb.CreateApiSessionResponse + 37, // 34: ziti.edge_ctrl.pb.CreateTunnelTerminatorResponse.session:type_name -> ziti.edge_ctrl.pb.CreateSessionResponse + 3, // 35: ziti.edge_ctrl.pb.UpdateTunnelTerminatorRequest.precedence:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence + 75, // 36: ziti.edge_ctrl.pb.DataState.Revocation.ExpiresAt:type_name -> google.protobuf.Timestamp + 5, // 37: ziti.edge_ctrl.pb.DataState.Event.action:type_name -> ziti.edge_ctrl.pb.DataState.Action + 50, // 38: ziti.edge_ctrl.pb.DataState.Event.identity:type_name -> ziti.edge_ctrl.pb.DataState.Identity + 51, // 39: ziti.edge_ctrl.pb.DataState.Event.service:type_name -> ziti.edge_ctrl.pb.DataState.Service + 52, // 40: ziti.edge_ctrl.pb.DataState.Event.servicePolicy:type_name -> ziti.edge_ctrl.pb.DataState.ServicePolicy + 56, // 41: ziti.edge_ctrl.pb.DataState.Event.postureCheck:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck + 55, // 42: ziti.edge_ctrl.pb.DataState.Event.publicKey:type_name -> ziti.edge_ctrl.pb.DataState.PublicKey + 53, // 43: ziti.edge_ctrl.pb.DataState.Event.revocation:type_name -> ziti.edge_ctrl.pb.DataState.Revocation + 6, // 44: ziti.edge_ctrl.pb.DataState.PublicKey.usages:type_name -> ziti.edge_ctrl.pb.DataState.PublicKey.Usage + 7, // 45: ziti.edge_ctrl.pb.DataState.PublicKey.format:type_name -> ziti.edge_ctrl.pb.DataState.PublicKey.Format + 57, // 46: ziti.edge_ctrl.pb.DataState.PostureCheck.mac:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.Mac + 58, // 47: ziti.edge_ctrl.pb.DataState.PostureCheck.mfa:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.Mfa + 60, // 48: ziti.edge_ctrl.pb.DataState.PostureCheck.osList:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.OsList + 61, // 49: ziti.edge_ctrl.pb.DataState.PostureCheck.process:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.Process + 62, // 50: ziti.edge_ctrl.pb.DataState.PostureCheck.processMulti:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.ProcessMulti + 63, // 51: ziti.edge_ctrl.pb.DataState.PostureCheck.domains:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.Domains + 59, // 52: ziti.edge_ctrl.pb.DataState.PostureCheck.OsList.osList:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.Os + 61, // 53: ziti.edge_ctrl.pb.DataState.PostureCheck.ProcessMulti.processes:type_name -> ziti.edge_ctrl.pb.DataState.PostureCheck.Process + 3, // 54: ziti.edge_ctrl.pb.CreateApiSessionResponse.ServicePrecedencesEntry.value:type_name -> ziti.edge_ctrl.pb.TerminatorPrecedence + 55, // [55:55] is the sub-list for method output_type + 55, // [55:55] is the sub-list for method input_type + 55, // [55:55] is the sub-list for extension type_name + 55, // [55:55] is the sub-list for extension extendee + 0, // [0:55] is the sub-list for field type_name } func init() { file_edge_ctrl_proto_init() } @@ -4339,7 +5418,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Config); i { + switch v := v.(*DataState); i { case 0: return &v.state case 1: @@ -4351,7 +5430,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SignerCerts); i { + switch v := v.(*Session); i { case 0: return &v.state case 1: @@ -4363,7 +5442,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Identity); i { + switch v := v.(*ApiSession); i { case 0: return &v.state case 1: @@ -4375,7 +5454,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostureSet); i { + switch v := v.(*ApiSessionAdded); i { case 0: return &v.state case 1: @@ -4387,7 +5466,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostureCheck); i { + switch v := v.(*ApiSessionUpdated); i { case 0: return &v.state case 1: @@ -4399,7 +5478,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Session); i { + switch v := v.(*ApiSessionRemoved); i { case 0: return &v.state case 1: @@ -4411,7 +5490,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApiSession); i { + switch v := v.(*ApiSessionHeartbeat); i { case 0: return &v.state case 1: @@ -4423,7 +5502,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApiSessionAdded); i { + switch v := v.(*SessionRemoved); i { case 0: return &v.state case 1: @@ -4435,7 +5514,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApiSessionUpdated); i { + switch v := v.(*RequestClientReSync); i { case 0: return &v.state case 1: @@ -4447,7 +5526,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApiSessionRemoved); i { + switch v := v.(*CreateCircuitRequest); i { case 0: return &v.state case 1: @@ -4459,7 +5538,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApiSessionHeartbeat); i { + switch v := v.(*CreateCircuitResponse); i { case 0: return &v.state case 1: @@ -4471,7 +5550,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SessionRemoved); i { + switch v := v.(*CreateTerminatorRequest); i { case 0: return &v.state case 1: @@ -4483,7 +5562,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RequestClientReSync); i { + switch v := v.(*CreateTerminatorV2Request); i { case 0: return &v.state case 1: @@ -4495,7 +5574,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateCircuitRequest); i { + switch v := v.(*CreateTerminatorV2Response); i { case 0: return &v.state case 1: @@ -4507,7 +5586,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateCircuitResponse); i { + switch v := v.(*RemoveTerminatorRequest); i { case 0: return &v.state case 1: @@ -4519,7 +5598,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTerminatorRequest); i { + switch v := v.(*UpdateTerminatorRequest); i { case 0: return &v.state case 1: @@ -4531,7 +5610,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTerminatorV2Request); i { + switch v := v.(*HealthEventRequest); i { case 0: return &v.state case 1: @@ -4543,7 +5622,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTerminatorV2Response); i { + switch v := v.(*ValidateSessionsRequest); i { case 0: return &v.state case 1: @@ -4555,7 +5634,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveTerminatorRequest); i { + switch v := v.(*EnvInfo); i { case 0: return &v.state case 1: @@ -4567,7 +5646,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateTerminatorRequest); i { + switch v := v.(*SdkInfo); i { case 0: return &v.state case 1: @@ -4579,7 +5658,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HealthEventRequest); i { + switch v := v.(*CreateApiSessionRequest); i { case 0: return &v.state case 1: @@ -4591,7 +5670,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateSessionsRequest); i { + switch v := v.(*CreateApiSessionResponse); i { case 0: return &v.state case 1: @@ -4603,7 +5682,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnvInfo); i { + switch v := v.(*CreateCircuitForServiceRequest); i { case 0: return &v.state case 1: @@ -4615,7 +5694,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SdkInfo); i { + switch v := v.(*CreateSessionResponse); i { case 0: return &v.state case 1: @@ -4627,7 +5706,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateApiSessionRequest); i { + switch v := v.(*CreateCircuitForServiceResponse); i { case 0: return &v.state case 1: @@ -4639,7 +5718,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateApiSessionResponse); i { + switch v := v.(*ServicesList); i { case 0: return &v.state case 1: @@ -4651,7 +5730,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateCircuitForServiceRequest); i { + switch v := v.(*TunnelService); i { case 0: return &v.state case 1: @@ -4663,7 +5742,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateSessionResponse); i { + switch v := v.(*CreateTunnelTerminatorRequest); i { case 0: return &v.state case 1: @@ -4675,7 +5754,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateCircuitForServiceResponse); i { + switch v := v.(*CreateTunnelTerminatorResponse); i { case 0: return &v.state case 1: @@ -4687,7 +5766,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServicesList); i { + switch v := v.(*UpdateTunnelTerminatorRequest); i { case 0: return &v.state case 1: @@ -4699,7 +5778,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TunnelService); i { + switch v := v.(*EnrollmentExtendRouterRequest); i { case 0: return &v.state case 1: @@ -4711,7 +5790,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTunnelTerminatorRequest); i { + switch v := v.(*EnrollmentCertsResponse); i { case 0: return &v.state case 1: @@ -4723,7 +5802,7 @@ func file_edge_ctrl_proto_init() { } } file_edge_ctrl_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTunnelTerminatorResponse); i { + switch v := v.(*EnrollmentExtendRouterVerifyRequest); i { case 0: return &v.state case 1: @@ -4734,8 +5813,8 @@ func file_edge_ctrl_proto_init() { return nil } } - file_edge_ctrl_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateTunnelTerminatorRequest); i { + file_edge_ctrl_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_Identity); i { case 0: return &v.state case 1: @@ -4746,8 +5825,8 @@ func file_edge_ctrl_proto_init() { return nil } } - file_edge_ctrl_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnrollmentExtendRouterRequest); i { + file_edge_ctrl_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_Service); i { case 0: return &v.state case 1: @@ -4758,8 +5837,8 @@ func file_edge_ctrl_proto_init() { return nil } } - file_edge_ctrl_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnrollmentCertsResponse); i { + file_edge_ctrl_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_ServicePolicy); i { case 0: return &v.state case 1: @@ -4770,8 +5849,128 @@ func file_edge_ctrl_proto_init() { return nil } } - file_edge_ctrl_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnrollmentExtendRouterVerifyRequest); i { + file_edge_ctrl_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_Revocation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_edge_ctrl_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_Event); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_edge_ctrl_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_PublicKey); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_edge_ctrl_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_PostureCheck); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_edge_ctrl_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_PostureCheck_Mac); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_edge_ctrl_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_PostureCheck_Mfa); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_edge_ctrl_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_PostureCheck_Os); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_edge_ctrl_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_PostureCheck_OsList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_edge_ctrl_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_PostureCheck_Process); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_edge_ctrl_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_PostureCheck_ProcessMulti); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_edge_ctrl_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataState_PostureCheck_Domains); i { case 0: return &v.state case 1: @@ -4783,13 +5982,29 @@ func file_edge_ctrl_proto_init() { } } } + file_edge_ctrl_proto_msgTypes[46].OneofWrappers = []interface{}{ + (*DataState_Event_Identity)(nil), + (*DataState_Event_Service)(nil), + (*DataState_Event_ServicePolicy)(nil), + (*DataState_Event_PostureCheck)(nil), + (*DataState_Event_PublicKey)(nil), + (*DataState_Event_Revocation)(nil), + } + file_edge_ctrl_proto_msgTypes[48].OneofWrappers = []interface{}{ + (*DataState_PostureCheck_Mac_)(nil), + (*DataState_PostureCheck_Mfa_)(nil), + (*DataState_PostureCheck_OsList_)(nil), + (*DataState_PostureCheck_Process_)(nil), + (*DataState_PostureCheck_ProcessMulti_)(nil), + (*DataState_PostureCheck_Domains_)(nil), + } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_edge_ctrl_proto_rawDesc, - NumEnums: 6, - NumMessages: 58, + NumEnums: 8, + NumMessages: 67, NumExtensions: 0, NumServices: 0, }, diff --git a/router/xgress_edge/listener.go b/router/xgress_edge/listener.go index 5a2bccf21..a60b53897 100644 --- a/router/xgress_edge/listener.go +++ b/router/xgress_edge/listener.go @@ -397,7 +397,7 @@ func (self *edgeClientConn) processBindV2(manager state.Manager, req *channel.Me WithFields(edge.GetLoggerFields(req)). WithField("routerId", self.listener.id.Token) - if self.listener.factory.stateManager.WasSessionRecentlyRemoved(token) { + if self.listener.factory.stateManager.WasSessionRecentlyRemoved(sessionToken) { log.Info("invalid session, not establishing terminator") self.sendStateClosedReply("invalid session", req) return @@ -480,7 +480,7 @@ func (self *edgeClientConn) processBindV2(manager state.Manager, req *channel.Me return } - if checkResult.previous == nil || checkResult.previous.token != token { + if checkResult.previous == nil || checkResult.previous.token != sessionToken { // need to remove session remove listener on close terminator.onClose = self.listener.factory.stateManager.AddEdgeSessionRemovedListener(sessionToken, func(token string) { terminator.close(self.listener.factory.hostedServices, true, true, "session ended") @@ -556,9 +556,7 @@ func (self *edgeClientConn) processUpdateBind(manager state.Manager, req *channe connId, _ := req.GetUint32Header(edge.ConnIdHeader) log := pfxlog.ContextLogger(ch.Label()).WithField("sessionToken", sessionToken).WithFields(edge.GetLoggerFields(req)) - terminators := self.listener.factory.hostedServices.getRelatedTerminators(sessionToken, self) - - terminators := self.listener.factory.hostedServices.getRelatedTerminators(connId, token, self) + terminators := self.listener.factory.hostedServices.getRelatedTerminators(connId, sessionToken, self) if len(terminators) == 0 { log.Error("failed to update bind, no listener found") @@ -650,7 +648,7 @@ func (self *edgeClientConn) processHealthEvent(manager state.Manager, req *chann request.ApiSessionToken = apiSession.Token } - log = log.WithField("terminator", terminator.terminatorId.Load()).WithField("checkPassed", checkPassed) + log = log.WithField("terminator", terminator.terminatorId).WithField("checkPassed", checkPassed) log.Debug("sending health event") if err := protobufs.MarshalTyped(request).Send(ctrlCh); err != nil { From af1a4e6a4b9673c0f2a3745f765cb1655d2219de Mon Sep 17 00:00:00 2001 From: Paul Lorenz Date: Wed, 13 Mar 2024 10:15:51 -0400 Subject: [PATCH 16/29] Update for golang sdk changes --- CHANGELOG.md | 22 +++++++++++++++++++++- go.mod | 4 ++-- go.sum | 8 ++++---- router/xgress_edge_tunnel/fabric.go | 4 ++++ tunnel/intercept/source_ip_test.go | 4 ++++ tunnel/intercept/svcpoll.go | 2 +- tunnel/provider.go | 3 ++- version | 2 +- zititest/go.mod | 4 ++-- zititest/go.sum | 8 ++++---- 10 files changed, 45 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 226940495..e2a431520 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,24 @@ +# Release 0.34.0 + +## What's New + +## Component Updates and Bug Fixes + +* github.com/openziti/channel/v2: [v2.0.119 -> v2.0.121](https://github.com/openziti/channel/compare/v2.0.119...v2.0.121) +* github.com/openziti/edge-api: [v0.26.12 -> v0.26.13](https://github.com/openziti/edge-api/compare/v0.26.12...v0.26.13) +* github.com/openziti/foundation/v2: [v2.0.37 -> v2.0.39](https://github.com/openziti/foundation/compare/v2.0.37...v2.0.39) +* github.com/openziti/identity: [v1.0.70 -> v1.0.72](https://github.com/openziti/identity/compare/v1.0.70...v1.0.72) +* github.com/openziti/metrics: [v1.2.45 -> v1.2.47](https://github.com/openziti/metrics/compare/v1.2.45...v1.2.47) +* github.com/openziti/runzmd: [v1.0.38 -> v1.0.40](https://github.com/openziti/runzmd/compare/v1.0.38...v1.0.40) +* github.com/openziti/sdk-golang: [v0.22.28 -> v0.23.10](https://github.com/openziti/sdk-golang/compare/v0.22.28...v0.23.10) + * [Issue #515](https://github.com/openziti/sdk-golang/issues/515) - Service hosting improvements + * [Issue #501](https://github.com/openziti/sdk-golang/issues/501) - Improve hosting session management + +* github.com/openziti/secretstream: [v0.1.16 -> v0.1.17](https://github.com/openziti/secretstream/compare/v0.1.16...v0.1.17) +* github.com/openziti/storage: [v0.2.30 -> v0.2.32](https://github.com/openziti/storage/compare/v0.2.30...v0.2.32) +* github.com/openziti/transport/v2: [v2.0.122 -> v2.0.124](https://github.com/openziti/transport/compare/v2.0.122...v2.0.124) +* github.com/openziti/ziti: [v0.33.1 -> v0.34.0](https://github.com/openziti/ziti/compare/v0.33.1...v0.34.0) + # Release 0.33.1 ## What's New @@ -8,7 +29,6 @@ * github.com/openziti/ziti: [v0.33.0 -> v0.33.1](https://github.com/openziti/ziti/compare/v0.33.0...v0.33.1) * [Issue #1826](https://github.com/openziti/ziti/issues/1826) - 0.33.+ routers can cause panic in pre-0.33 controller with new metric - # Release 0.33.0 ## What's New diff --git a/go.mod b/go.mod index 8c759fee0..826cf69dd 100644 --- a/go.mod +++ b/go.mod @@ -54,10 +54,10 @@ require ( github.com/openziti/identity v1.0.72 github.com/openziti/jwks v1.0.3 github.com/openziti/metrics v1.2.47 - github.com/openziti/runzmd v1.0.38 + github.com/openziti/runzmd v1.0.40 github.com/openziti/sdk-golang v0.23.10 github.com/openziti/secretstream v0.1.17 - github.com/openziti/storage v0.2.30 + github.com/openziti/storage v0.2.32 github.com/openziti/transport/v2 v2.0.124 github.com/openziti/x509-claims v1.0.3 github.com/openziti/xweb/v2 v2.1.0 diff --git a/go.sum b/go.sum index 7eb05d782..a24dd8a0c 100644 --- a/go.sum +++ b/go.sum @@ -580,14 +580,14 @@ github.com/openziti/jwks v1.0.3 h1:hf8wkb+Cg4nH/HM0KROFd7u+C3DkRVcFZJ7tDV+4icc= github.com/openziti/jwks v1.0.3/go.mod h1:t4xxq8vlXGsPn29kiQVnZBBDDnEoOFqtJoHibkJunQQ= github.com/openziti/metrics v1.2.47 h1:hIp1xnqLxNc7O0yTHIp65REhYBXj7QWeOiayGDzjRrw= github.com/openziti/metrics v1.2.47/go.mod h1:pHj/z3HCls4/+dLoQKTURNTnHmwUbjZFZOGzj2X6HeI= -github.com/openziti/runzmd v1.0.38 h1:0eFWAf7R9Thx99ue7Gql2dBavsqv4jldU8W5AIZJ8wo= -github.com/openziti/runzmd v1.0.38/go.mod h1:WiQi+YIXxZBH1bwjr+eo/e3ftfTLEABpN0i2QIhBI9w= +github.com/openziti/runzmd v1.0.40 h1:QQuYr7QHci3PTLZJGjaOpH3uGxRCjGJ3DF1KgxXIzq4= +github.com/openziti/runzmd v1.0.40/go.mod h1:WhNu56fgNpDTMKuiLgsqYJLVso0ByDPADsAQZj9m8Lo= github.com/openziti/sdk-golang v0.23.10 h1:ygpOt99Rd5ESoH1ExYqBHhZp47s5/DYxyfgTO6uYr7Q= github.com/openziti/sdk-golang v0.23.10/go.mod h1:07G4gYyZzRt9fb3uxEhwdsgJwDrqEkjuvVnnRlsrfEc= github.com/openziti/secretstream v0.1.17 h1:bcaPGGpUl0+3GzfQkshKh5slUE7QDXxFq3vyDQgHkCA= github.com/openziti/secretstream v0.1.17/go.mod h1:gosi8ohW+dAHhz1h/MjZEcEVWO0jisWqWjEjmx7oAEs= -github.com/openziti/storage v0.2.30 h1:15o8rSSgtcNCSBONt81ZRASQXJHh2L9Y0aWcHoQ81dE= -github.com/openziti/storage v0.2.30/go.mod h1:ltsgk2G0c3jVZVTK5bHkRtblGdFFoSJ3fOMur/0iFKg= +github.com/openziti/storage v0.2.32 h1:LmW6AhSZ2fu25afXIOAwJOikUOxiMIMRPSLPKWD5++Y= +github.com/openziti/storage v0.2.32/go.mod h1:ImCFExNWGVW8Pz0UcVw9o38+jcskXIQ/6prrJtDyhE8= github.com/openziti/transport/v2 v2.0.124 h1:84bq7vyqzGJXPek9qyc/7mtVEhp6KTQMK2msq3hwGkY= github.com/openziti/transport/v2 v2.0.124/go.mod h1:eQ3011tfSlmBI3cIkcJOf9YP/afj+Jd2EQM6MCHoJCQ= github.com/openziti/x509-claims v1.0.3 h1:HNdQ8Nf1agB3lBs1gahcO6zfkeS4S5xoQ2/PkY4HRX0= diff --git a/router/xgress_edge_tunnel/fabric.go b/router/xgress_edge_tunnel/fabric.go index 7d064aac3..8cac3cbcc 100644 --- a/router/xgress_edge_tunnel/fabric.go +++ b/router/xgress_edge_tunnel/fabric.go @@ -204,6 +204,10 @@ func (self *fabricProvider) GetCurrentIdentity() (*rest_model.IdentityDetail, er return self.currentIdentity, nil } +func (self *fabricProvider) GetCurrentIdentityWithBackoff() (*rest_model.IdentityDetail, error) { + return self.currentIdentity, nil +} + func (self *fabricProvider) TunnelService(service tunnel.Service, terminatorInstanceId string, conn net.Conn, halfClose bool, appData []byte) error { keyPair, err := kx.NewKeyPair() if err != nil { diff --git a/tunnel/intercept/source_ip_test.go b/tunnel/intercept/source_ip_test.go index 1e23d84c3..6e4e024ef 100644 --- a/tunnel/intercept/source_ip_test.go +++ b/tunnel/intercept/source_ip_test.go @@ -32,6 +32,10 @@ func (self *testProvider) GetCurrentIdentity() (*rest_model.IdentityDetail, erro }, nil } +func (self *testProvider) GetCurrentIdentityWithBackoff() (*rest_model.IdentityDetail, error) { + return self.GetCurrentIdentity() +} + func (self *testProvider) TunnelService(service tunnel.Service, identity string, conn net.Conn, halfClose bool, appInfo []byte) error { panic("implement me") } diff --git a/tunnel/intercept/svcpoll.go b/tunnel/intercept/svcpoll.go index 0136ab1a7..52f9f5e45 100644 --- a/tunnel/intercept/svcpoll.go +++ b/tunnel/intercept/svcpoll.go @@ -282,7 +282,7 @@ func (self *ServiceListener) removeService(svc *entities.Service) { func (self *ServiceListener) host(svc *entities.Service, tracker AddressTracker) { logger := pfxlog.Logger().WithField("service", *svc.Name) - currentIdentity, err := self.provider.GetCurrentIdentity() + currentIdentity, err := self.provider.GetCurrentIdentityWithBackoff() if err != nil { logger.WithError(err).Error("error getting current identity information") return diff --git a/tunnel/provider.go b/tunnel/provider.go index 8ce58941b..4ce0c586e 100644 --- a/tunnel/provider.go +++ b/tunnel/provider.go @@ -3,9 +3,9 @@ package tunnel import ( "encoding/json" "github.com/openziti/edge-api/rest_model" - "github.com/openziti/ziti/tunnel/health" "github.com/openziti/sdk-golang/ziti" "github.com/openziti/sdk-golang/ziti/edge" + "github.com/openziti/ziti/tunnel/health" "github.com/sirupsen/logrus" "io" "net" @@ -32,6 +32,7 @@ type HostControl interface { type FabricProvider interface { PrepForUse(serviceId string) GetCurrentIdentity() (*rest_model.IdentityDetail, error) + GetCurrentIdentityWithBackoff() (*rest_model.IdentityDetail, error) TunnelService(service Service, identity string, conn net.Conn, halfClose bool, appInfo []byte) error HostService(hostCtx HostingContext) (HostControl, error) } diff --git a/version b/version index 94b357edf..61d2f3576 100644 --- a/version +++ b/version @@ -1 +1 @@ -0.33 +0.34 diff --git a/zititest/go.mod b/zititest/go.mod index 054da71cf..02656735b 100644 --- a/zititest/go.mod +++ b/zititest/go.mod @@ -19,7 +19,7 @@ require ( github.com/openziti/foundation/v2 v2.0.39 github.com/openziti/identity v1.0.72 github.com/openziti/sdk-golang v0.23.10 - github.com/openziti/storage v0.2.30 + github.com/openziti/storage v0.2.32 github.com/openziti/transport/v2 v2.0.124 github.com/openziti/ziti v0.28.3 github.com/pkg/errors v0.9.1 @@ -138,7 +138,7 @@ require ( github.com/openziti/dilithium v0.3.3 // indirect github.com/openziti/jwks v1.0.3 // indirect github.com/openziti/metrics v1.2.47 // indirect - github.com/openziti/runzmd v1.0.38 // indirect + github.com/openziti/runzmd v1.0.40 // indirect github.com/openziti/secretstream v0.1.17 // indirect github.com/openziti/x509-claims v1.0.3 // indirect github.com/openziti/xweb/v2 v2.1.0 // indirect diff --git a/zititest/go.sum b/zititest/go.sum index cd7430844..1f8ce7fe2 100644 --- a/zititest/go.sum +++ b/zititest/go.sum @@ -604,14 +604,14 @@ github.com/openziti/jwks v1.0.3 h1:hf8wkb+Cg4nH/HM0KROFd7u+C3DkRVcFZJ7tDV+4icc= github.com/openziti/jwks v1.0.3/go.mod h1:t4xxq8vlXGsPn29kiQVnZBBDDnEoOFqtJoHibkJunQQ= github.com/openziti/metrics v1.2.47 h1:hIp1xnqLxNc7O0yTHIp65REhYBXj7QWeOiayGDzjRrw= github.com/openziti/metrics v1.2.47/go.mod h1:pHj/z3HCls4/+dLoQKTURNTnHmwUbjZFZOGzj2X6HeI= -github.com/openziti/runzmd v1.0.38 h1:0eFWAf7R9Thx99ue7Gql2dBavsqv4jldU8W5AIZJ8wo= -github.com/openziti/runzmd v1.0.38/go.mod h1:WiQi+YIXxZBH1bwjr+eo/e3ftfTLEABpN0i2QIhBI9w= +github.com/openziti/runzmd v1.0.40 h1:QQuYr7QHci3PTLZJGjaOpH3uGxRCjGJ3DF1KgxXIzq4= +github.com/openziti/runzmd v1.0.40/go.mod h1:WhNu56fgNpDTMKuiLgsqYJLVso0ByDPADsAQZj9m8Lo= github.com/openziti/sdk-golang v0.23.10 h1:ygpOt99Rd5ESoH1ExYqBHhZp47s5/DYxyfgTO6uYr7Q= github.com/openziti/sdk-golang v0.23.10/go.mod h1:07G4gYyZzRt9fb3uxEhwdsgJwDrqEkjuvVnnRlsrfEc= github.com/openziti/secretstream v0.1.17 h1:bcaPGGpUl0+3GzfQkshKh5slUE7QDXxFq3vyDQgHkCA= github.com/openziti/secretstream v0.1.17/go.mod h1:gosi8ohW+dAHhz1h/MjZEcEVWO0jisWqWjEjmx7oAEs= -github.com/openziti/storage v0.2.30 h1:15o8rSSgtcNCSBONt81ZRASQXJHh2L9Y0aWcHoQ81dE= -github.com/openziti/storage v0.2.30/go.mod h1:ltsgk2G0c3jVZVTK5bHkRtblGdFFoSJ3fOMur/0iFKg= +github.com/openziti/storage v0.2.32 h1:LmW6AhSZ2fu25afXIOAwJOikUOxiMIMRPSLPKWD5++Y= +github.com/openziti/storage v0.2.32/go.mod h1:ImCFExNWGVW8Pz0UcVw9o38+jcskXIQ/6prrJtDyhE8= github.com/openziti/transport/v2 v2.0.124 h1:84bq7vyqzGJXPek9qyc/7mtVEhp6KTQMK2msq3hwGkY= github.com/openziti/transport/v2 v2.0.124/go.mod h1:eQ3011tfSlmBI3cIkcJOf9YP/afj+Jd2EQM6MCHoJCQ= github.com/openziti/x509-claims v1.0.3 h1:HNdQ8Nf1agB3lBs1gahcO6zfkeS4S5xoQ2/PkY4HRX0= From 3c222ef417b76ca2ac49841877fa7cf59fc97830 Mon Sep 17 00:00:00 2001 From: Zach Shames Date: Sat, 16 Mar 2024 13:19:59 +0000 Subject: [PATCH 17/29] doc: Adds BlueBubbles to ADOPTERS.md --- ADOPTERS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ADOPTERS.md b/ADOPTERS.md index 278470b6a..3a0e82d55 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -22,6 +22,7 @@ open source that have embedded OpenZiti into the project, or use OpenZiti for se | Project Name | Project Link | Source URL | Logo | How OpenZiti is used or why OpenZiti was chosen | |-------------|-----------------|------------|------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------| | zrok | https://zrok.io | https://github.com/openziti/zrok | | An open source sharing solution built on OpenZiti, the zero trust networking platform. Available as SaaS or self-hosted. | +| BlueBubbles | https://bluebubbles.app | https://github.com/BlueBubblesApp | | BlueBubbles is an open-source app ecosystem dedicated to bringing iMessage to Android, Windows, and Linux. Shock your iPhone friends by iMessaging them from nearly any platform! | ## Other Adopters From 0085e92ad4b708c4e1c47e818528261c00ff6dd0 Mon Sep 17 00:00:00 2001 From: Paul Lorenz Date: Sun, 17 Mar 2024 12:05:21 -0400 Subject: [PATCH 18/29] Update HA smoketest for HA changes --- controller/raft/mesh/mesh.go | 4 ++-- etc/ctrl.with.edge.yml | 1 + router/state/manager.go | 5 +++-- router/xgress_edge/factory.go | 2 +- router/xgress_edge/hosted.go | 16 +++++++++++++++- router/xgress_edge_tunnel/fabric.go | 4 ++-- ziti/cmd/demo/echo_server.go | 7 +++++++ ziti/cmd/demo/zcat.go | 3 +++ zititest/models/simple/configs/ctrl.yml.tmpl | 8 +------- zititest/models/simple/configs/router.yml.tmpl | 5 +++++ zititest/models/simple/simple.go | 2 +- zititest/tests/echo_test.go | 10 +++++++--- zititest/tests/scp_test.go | 3 ++- zititest/zitilab/component_echo_server.go | 11 ++++++++--- 14 files changed, 58 insertions(+), 23 deletions(-) diff --git a/controller/raft/mesh/mesh.go b/controller/raft/mesh/mesh.go index d37a4387f..a9c532ac0 100644 --- a/controller/raft/mesh/mesh.go +++ b/controller/raft/mesh/mesh.go @@ -421,8 +421,8 @@ func (self *impl) GetPeer(addr raft.ServerAddress) *Peer { } func (self *impl) PeerDisconnected(peer *Peer) { - self.lock.RLock() - defer self.lock.RUnlock() + self.lock.Lock() + defer self.lock.Unlock() currentPeer := self.Peers[peer.Address] if currentPeer == nil || currentPeer != peer { return diff --git a/etc/ctrl.with.edge.yml b/etc/ctrl.with.edge.yml index 3e7405077..bbfa0ab21 100644 --- a/etc/ctrl.with.edge.yml +++ b/etc/ctrl.with.edge.yml @@ -243,6 +243,7 @@ web: options: { } - binding: edge-oidc options: + secret: 38de0de7fa283e8c8ef2a7823a6d3e727681ade50b9eb7bee2424197fb22bf18 redirectURIs: - "http://localhost:*/auth/callback" - "http://127.0.0.1:*/auth/callback" diff --git a/router/state/manager.go b/router/state/manager.go index e8ed64abb..cca41cdb9 100644 --- a/router/state/manager.go +++ b/router/state/manager.go @@ -441,9 +441,10 @@ func (sm *ManagerImpl) GetApiSession(token string) *ApiSession { JwtToken: jwtToken, Claims: accessClaims, } + } else { + pfxlog.Logger().WithError(err).Error("JWT validation failed") + return nil } - - //fall through to check if the token is a zt-session } if apiSession, ok := sm.apiSessionsByToken.Get(token); ok { diff --git a/router/xgress_edge/factory.go b/router/xgress_edge/factory.go index f84a40d89..9ddcb7328 100644 --- a/router/xgress_edge/factory.go +++ b/router/xgress_edge/factory.go @@ -137,7 +137,7 @@ func (factory *Factory) LoadConfig(configMap map[interface{}]interface{}) error func NewFactory(routerConfig *router.Config, env env.RouterEnv, stateManager state.Manager) *Factory { factory := &Factory{ ctrls: env.GetNetworkControllers(), - hostedServices: newHostedServicesRegistry(env), + hostedServices: newHostedServicesRegistry(env, stateManager), stateManager: stateManager, versionProvider: env.GetVersionInfo(), routerConfig: routerConfig, diff --git a/router/xgress_edge/hosted.go b/router/xgress_edge/hosted.go index ddf64f75c..e58df1c85 100644 --- a/router/xgress_edge/hosted.go +++ b/router/xgress_edge/hosted.go @@ -28,19 +28,22 @@ import ( "github.com/openziti/ziti/controller/apierror" "github.com/openziti/ziti/controller/command" routerEnv "github.com/openziti/ziti/router/env" + "github.com/openziti/ziti/router/state" cmap "github.com/orcaman/concurrent-map/v2" "github.com/pkg/errors" "github.com/sirupsen/logrus" "google.golang.org/protobuf/proto" + "strings" "sync/atomic" "time" ) -func newHostedServicesRegistry(env routerEnv.RouterEnv) *hostedServiceRegistry { +func newHostedServicesRegistry(env routerEnv.RouterEnv, stateManager state.Manager) *hostedServiceRegistry { result := &hostedServiceRegistry{ terminators: cmap.New[*edgeTerminator](), events: make(chan terminatorEvent), env: env, + stateManager: stateManager, triggerEvalC: make(chan struct{}, 1), establishSet: map[string]*edgeTerminator{}, deleteSet: map[string]*edgeTerminator{}, @@ -53,6 +56,7 @@ type hostedServiceRegistry struct { terminators cmap.ConcurrentMap[string, *edgeTerminator] events chan terminatorEvent env routerEnv.RouterEnv + stateManager state.Manager establishSet map[string]*edgeTerminator deleteSet map[string]*edgeTerminator triggerEvalC chan struct{} @@ -546,6 +550,16 @@ func (self *hostedServiceRegistry) establishTerminator(terminator *edgeTerminato InstanceSecret: terminator.instanceSecret, } + if self.stateManager.GetConfig().Ha.Enabled && strings.HasPrefix(request.SessionToken, JwtTokenPrefix) { + apiSession := self.stateManager.GetApiSessionFromCh(terminator.Channel) + + if apiSession == nil { + return errors.New("could not find api session for channel, unable to process bind message") + } + + request.ApiSessionToken = apiSession.Token + } + ctrlCh := factory.ctrls.AnyCtrlChannel() if ctrlCh == nil { errStr := "no controller available, cannot create terminator" diff --git a/router/xgress_edge_tunnel/fabric.go b/router/xgress_edge_tunnel/fabric.go index 8cac3cbcc..5a966f071 100644 --- a/router/xgress_edge_tunnel/fabric.go +++ b/router/xgress_edge_tunnel/fabric.go @@ -19,7 +19,6 @@ package xgress_edge_tunnel import ( "encoding/json" "github.com/cenkalti/backoff/v4" - "github.com/google/uuid" "github.com/michaelquigley/pfxlog" "github.com/openziti/channel/v2" "github.com/openziti/channel/v2/protobufs" @@ -33,6 +32,7 @@ import ( "github.com/openziti/ziti/common/build" "github.com/openziti/ziti/common/ctrl_msg" "github.com/openziti/ziti/common/pb/edge_ctrl_pb" + "github.com/openziti/ziti/controller/idgen" "github.com/openziti/ziti/router/xgress" "github.com/openziti/ziti/router/xgress_common" "github.com/openziti/ziti/tunnel" @@ -289,7 +289,7 @@ func (self *fabricProvider) TunnelService(service tunnel.Service, terminatorInst } func (self *fabricProvider) HostService(hostCtx tunnel.HostingContext) (tunnel.HostControl, error) { - id := uuid.NewString() + id := idgen.NewUUIDString() terminator := &tunnelTerminator{ id: id, diff --git a/ziti/cmd/demo/echo_server.go b/ziti/cmd/demo/echo_server.go index 47d3be59c..9df832547 100644 --- a/ziti/cmd/demo/echo_server.go +++ b/ziti/cmd/demo/echo_server.go @@ -60,6 +60,7 @@ type echoServer struct { cliAgentEnabled bool cliAgentAddr string cliAgentAlias string + ha bool } func newEchoServerCmd() *cobra.Command { @@ -84,6 +85,7 @@ func newEchoServerCmd() *cobra.Command { cmd.Flags().BoolVar(&server.cliAgentEnabled, "cli-agent", true, "Enable/disable CLI Agent (enabled by default)") cmd.Flags().StringVar(&server.cliAgentAddr, "cli-agent-addr", "", "Specify where CLI Agent should list (ex: unix:/tmp/myfile.sock or tcp:127.0.0.1:10001)") cmd.Flags().StringVar(&server.cliAgentAlias, "cli-agent-alias", "", "Alias which can be used by ziti agent commands to find this instance") + cmd.Flags().BoolVar(&server.ha, "ha", false, "Enable HA controller compatibility") return cmd } @@ -157,6 +159,7 @@ func (self *echoServer) run(*cobra.Command, []string) { if err != nil { log.WithError(err).Fatalf("ziti: unable to load ziti identity from [%v]", self.configFile) } + zitiConfig.EnableHa = self.ha self.zitiIdentity, err = identity.LoadIdentity(zitiConfig.ID) if err != nil { log.WithError(err).Fatalf("ziti: unable to create ziti identity from [%v]", self.configFile) @@ -168,6 +171,10 @@ func (self *echoServer) run(*cobra.Command, []string) { log.WithError(err).Fatal("unable to get create ziti context from config") } + if self.ha { + zitiContext.(*ziti.ContextImpl).CtrlClt.SetUseOidc(true) + } + zitiIdentity, err := zitiContext.GetCurrentIdentity() if err != nil { log.WithError(err).Fatal("unable to get current ziti identity from controller") diff --git a/ziti/cmd/demo/zcat.go b/ziti/cmd/demo/zcat.go index 45b0d0c15..b6023c555 100644 --- a/ziti/cmd/demo/zcat.go +++ b/ziti/cmd/demo/zcat.go @@ -34,6 +34,7 @@ type zcatAction struct { verbose bool logFormatter string configFile string + ha bool // todo: remove when ha flag is no longer needed } func newZcatCmd() *cobra.Command { @@ -52,6 +53,7 @@ func newZcatCmd() *cobra.Command { cmd.Flags().BoolVarP(&action.verbose, "verbose", "v", false, "Enable verbose logging") cmd.Flags().StringVar(&action.logFormatter, "log-formatter", "", "Specify log formatter [json|pfxlog|text]") cmd.Flags().StringVarP(&action.configFile, "identity", "i", "", "Specify the Ziti identity to use. If not specified the Ziti listener won't be started") + cmd.Flags().BoolVar(&action.ha, "ha", false, "Enable HA controller compatibility") cmd.Flags().SetInterspersed(true) return cmd @@ -107,6 +109,7 @@ func (self *zcatAction) run(_ *cobra.Command, args []string) { dialIdentifier = addr[:atIdx] addr = addr[atIdx+1:] } + zitiConfig.EnableHa = self.ha zitiContext, ctxErr := ziti.NewContext(zitiConfig) if ctxErr != nil { diff --git a/zititest/models/simple/configs/ctrl.yml.tmpl b/zititest/models/simple/configs/ctrl.yml.tmpl index d9627275e..9a3948d03 100644 --- a/zititest/models/simple/configs/ctrl.yml.tmpl +++ b/zititest/models/simple/configs/ctrl.yml.tmpl @@ -188,13 +188,7 @@ web: # - edge-client # - fabric-management - binding: health-checks - options: {} - binding: fabric - binding: edge-management - # options - variable optional/required - # This section is used to define values that are specified by the API they are associated with. - # These settings are per API. The example below is for the `edge-api` and contains both optional values and - # required values. - options: {} - binding: edge-client - options: {} + - binding: edge-oidc \ No newline at end of file diff --git a/zititest/models/simple/configs/router.yml.tmpl b/zititest/models/simple/configs/router.yml.tmpl index 0f5bd0e01..1d1590aa7 100644 --- a/zititest/models/simple/configs/router.yml.tmpl +++ b/zititest/models/simple/configs/router.yml.tmpl @@ -6,6 +6,11 @@ v: 3 enableDebugOps: true +{{if .Component.GetFlag "ha"}} +ha: + enabled: true +{{end}} + identity: cert: /home/{{$ssh_username}}/fablab/cfg/{{$identity}}-client.cert server_cert: /home/{{$ssh_username}}/fablab/cfg/{{$identity}}-server.cert diff --git a/zititest/models/simple/simple.go b/zititest/models/simple/simple.go index 28c65e4f5..459b911bc 100644 --- a/zititest/models/simple/simple.go +++ b/zititest/models/simple/simple.go @@ -38,7 +38,7 @@ import ( "time" ) -const ZitiEdgeTunnelVersion = "v0.22.17" +const ZitiEdgeTunnelVersion = "v0.22.25" //go:embed configs var configResource embed.FS diff --git a/zititest/tests/echo_test.go b/zititest/tests/echo_test.go index bed362f36..001eefd9b 100644 --- a/zititest/tests/echo_test.go +++ b/zititest/tests/echo_test.go @@ -38,9 +38,13 @@ func TestSdkEcho(t *testing.T) { for _, c := range components { remoteConfigFile := "/home/ubuntu/fablab/cfg/" + c.Id + ".json" - echoClientCmd := fmt.Sprintf(`echo "%s" | /home/%s/fablab/bin/ziti demo zcat --identity %s ziti:echo 2>&1`, - string(data), c.GetHost().GetSshUser(), remoteConfigFile) - + ha := "" + if len(run.GetModel().SelectComponents(".ctrl")) > 1 { + ha = "--ha" + } + echoClientCmd := fmt.Sprintf(`echo "%s" | /home/%s/fablab/bin/ziti demo zcat %s --identity %s ziti:echo 2>&1`, + data, c.GetHost().GetSshUser(), ha, remoteConfigFile) + t.Logf("running: %s", echoClientCmd) output, err := c.GetHost().ExecLogged(echoClientCmd) t.Logf("test output:\n%s", output) req.NoError(err) diff --git a/zititest/tests/scp_test.go b/zititest/tests/scp_test.go index cde67deb2..8e93d4770 100644 --- a/zititest/tests/scp_test.go +++ b/zititest/tests/scp_test.go @@ -85,7 +85,7 @@ func testScp(t *testing.T, hostSelector string, hostType string, encrypted bool) encDesk = "unencrypted" } - success := false + success := true nameExtra := "" if !encrypted { @@ -107,6 +107,7 @@ func testScp(t *testing.T, hostSelector string, hostType string, encrypted bool) for _, test := range tests { t.Run(fmt.Sprintf("(%s%s%s)-%v", hostSelector, test.direction, hostType, encDesk), func(t *testing.T) { + success = false host, err := model.GetModel().SelectHost("." + hostSelector + "-client") req := require.New(t) req.NoError(err) diff --git a/zititest/zitilab/component_echo_server.go b/zititest/zitilab/component_echo_server.go index 7dedd6394..6ea0e7f98 100644 --- a/zititest/zitilab/component_echo_server.go +++ b/zititest/zitilab/component_echo_server.go @@ -45,15 +45,20 @@ func (self *EchoServerType) IsRunning(_ model.Run, c *model.Component) (bool, er return len(pids) > 0, nil } -func (self *EchoServerType) Start(_ model.Run, c *model.Component) error { +func (self *EchoServerType) Start(run model.Run, c *model.Component) error { user := c.GetHost().GetSshUser() binaryPath := getZitiBinaryPath(c, self.Version) configPath := fmt.Sprintf("/home/%s/fablab/cfg/%s.json", user, c.Id) logsPath := fmt.Sprintf("/home/%s/logs/%s.log", user, c.Id) - serviceCmd := fmt.Sprintf("nohup %s demo echo-server -i %s --cli-agent-alias %s > %s 2>&1 &", - binaryPath, configPath, c.Id, logsPath) + ha := "" + if len(run.GetModel().SelectComponents(".ctrl")) > 1 { + ha = "--ha" + } + + serviceCmd := fmt.Sprintf("nohup %s demo echo-server --cli-agent-alias %s %s -i %s > %s 2>&1 &", + binaryPath, c.Id, ha, configPath, logsPath) value, err := c.GetHost().ExecLogged(serviceCmd) if err != nil { From 8921b49ee4c4996d7cc28866e897672564b5ce93 Mon Sep 17 00:00:00 2001 From: Kenneth Bingham Date: Tue, 19 Mar 2024 19:44:06 -0400 Subject: [PATCH 19/29] add tags to old VPCs --- zititest/scripts/housekeeper-aws.bash | 28 ++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/zititest/scripts/housekeeper-aws.bash b/zititest/scripts/housekeeper-aws.bash index 8465acd8a..8fcbf20cc 100644 --- a/zititest/scripts/housekeeper-aws.bash +++ b/zititest/scripts/housekeeper-aws.bash @@ -25,7 +25,7 @@ function describe_instances() { |{InstanceId: .InstanceId, Region: $region, LaunchTime: .LaunchTime, State: .State, Tags: .Tags} ] ' \ - | tee $old_file \ + | tee "$old_file" \ | jq 'length' | xargs -ILEN echo "Described LEN old instances in $region in $(realpath $old_file)" done } @@ -38,15 +38,20 @@ function describe_vpcs { local old_file="old-fablab-vpcs-${region}.json" local odd_file="odd-fablab-vpcs-${region}.json" local -A vpc_create_events=() odd_vpcs=() old_vpcs=() - read -ra all_fablab_vpcs < <( + all_fablab_vpcs_json="$( # shellcheck disable=SC2016 aws --region "$region" ec2 describe-vpcs \ - --query 'Vpcs[?Tags[?Key==`source` && Value==`fablab`]].VpcId' \ - --output text - ) - if [[ ${#all_fablab_vpcs[@]} -ge 1 ]] + --query 'Vpcs[?Tags[?Key==`source` && Value==`fablab`]]' \ + --output json + )" + local -a all_fablab_vpcs_ids=() + while read -r; do + all_fablab_vpcs_ids+=("$REPLY") + done < <(jq --raw-output '.[].VpcId' <<< "$all_fablab_vpcs_json") + # echo "DEBUG: found $(jq 'length' <<< "${all_fablab_vpcs_json}") fablab VPCs: ${all_fablab_vpcs_ids[*]}" + if [[ ${#all_fablab_vpcs_ids[@]} -ge 1 ]] then - for vpc_id in "${all_fablab_vpcs[@]}" + for vpc_id in "${all_fablab_vpcs_ids[@]}" do vpc_create_events["$vpc_id"]=$( # shellcheck disable=SC2016 @@ -57,7 +62,7 @@ function describe_vpcs { ) done - for vpc_id in "${all_fablab_vpcs[@]}" + for vpc_id in "${all_fablab_vpcs_ids[@]}" do if [[ "$(jq 'length' <<< "${vpc_create_events[$vpc_id]}")" -ne 1 ]] then @@ -84,6 +89,10 @@ function describe_vpcs { do if [[ "$(jq 'length' <<< "${old_vpcs[$vpc_id]}")" -eq 1 ]] then + # append the tags from describe all VPCs as a new key "tags" in the current VPC + local tags='{}' + tags="$(jq --arg vpc_id "${vpc_id}" '.[]|select(.VpcId == $vpc_id)|.Tags' <<< "${all_fablab_vpcs_json}")" + old_vpcs[$vpc_id]="$(jq --argjson tags "${tags}" '.[0] += {"tags": $tags}' <<< "${old_vpcs[$vpc_id]}")" old_vpcs_json=$(jq --argjson append "${old_vpcs[$vpc_id]}" '. += $append' <<< "${old_vpcs_json}") fi done @@ -182,7 +191,8 @@ do fi ;; --help|\?|*) - echo "Usage: $BASENAME [--age DAYS|--state (running|stopped)|stop FILE|terminate FILE]" + echo "Usage: $BASENAME [describe instance --age DAYS --state (running|stopped) | describe vpc ] | stop FILE | terminate FILE]"\ + "where FILE is a JSON file created by the describe command" exit 0 ;; esac From aad1ad57cf2423d72c0128f85609fe8f5c731642 Mon Sep 17 00:00:00 2001 From: Paul Lorenz Date: Wed, 20 Mar 2024 09:05:53 -0400 Subject: [PATCH 20/29] Add api session cert index to fix lookup perf. Fixes #1846 --- controller/db/api_session_certificate_store.go | 3 +-- controller/db/api_session_store.go | 14 +++++++++++--- controller/db/migrations.go | 8 +++++++- .../model/api_session_certificate_manager.go | 14 +++++++++----- tests/api_session_test.go | 1 - 5 files changed, 28 insertions(+), 12 deletions(-) diff --git a/controller/db/api_session_certificate_store.go b/controller/db/api_session_certificate_store.go index 13d5fe9bf..2762a8e4b 100644 --- a/controller/db/api_session_certificate_store.go +++ b/controller/db/api_session_certificate_store.go @@ -69,11 +69,10 @@ func (store *ApiSessionCertificateStoreImpl) initializeLocal() { store.AddSymbol(FieldApiSessionCertificateSubject, ast.NodeTypeString) store.AddSymbol(FieldApiSessionCertificateFingerprint, ast.NodeTypeString) store.symbolApiSession = store.AddFkSymbol(FieldApiSessionCertificateApiSession, store.stores.apiSession) - - store.AddFkConstraint(store.symbolApiSession, false, boltz.CascadeDelete) } func (store *ApiSessionCertificateStoreImpl) initializeLinked() { + store.AddFkIndex(store.symbolApiSession, store.stores.apiSession.apiSessionCertsSymbol) } func (store *ApiSessionCertificateStoreImpl) NewEntity() *ApiSessionCertificate { diff --git a/controller/db/api_session_store.go b/controller/db/api_session_store.go index 52e6c4b95..9bf65d435 100644 --- a/controller/db/api_session_store.go +++ b/controller/db/api_session_store.go @@ -92,9 +92,10 @@ func newApiSessionStore(stores *stores) *apiSessionStoreImpl { type apiSessionStoreImpl struct { *baseStore[*ApiSession] - indexToken boltz.ReadIndex - symbolIdentity boltz.EntitySymbol - eventsEmitter events.EventEmmiter + indexToken boltz.ReadIndex + symbolIdentity boltz.EntitySymbol + eventsEmitter events.EventEmmiter + apiSessionCertsSymbol boltz.EntitySetSymbol } func (store *apiSessionStoreImpl) NewEntity() *ApiSession { @@ -220,6 +221,12 @@ func (store *apiSessionStoreImpl) Update(ctx boltz.MutateContext, entity *ApiSes } func (store *apiSessionStoreImpl) DeleteById(ctx boltz.MutateContext, id string) error { + for _, apiSessionCertId := range store.GetRelatedEntitiesIdList(ctx.Tx(), id, EntityTypeApiSessionCertificates) { + if err := store.stores.apiSessionCertificate.DeleteById(ctx, apiSessionCertId); err != nil { + return err + } + } + err := store.baseStore.DeleteById(ctx, id) if err == nil { @@ -249,6 +256,7 @@ func (store *apiSessionStoreImpl) initializeLocal() { store.AddSymbol(FieldApiSessionLastActivityAt, ast.NodeTypeDatetime) store.AddFkConstraint(store.symbolIdentity, false, boltz.CascadeDelete) + store.apiSessionCertsSymbol = store.AddFkSetSymbol(EntityTypeApiSessionCertificates, store.stores.apiSessionCertificate) } func (store *apiSessionStoreImpl) initializeLinked() { diff --git a/controller/db/migrations.go b/controller/db/migrations.go index 92557c85f..194df31cc 100644 --- a/controller/db/migrations.go +++ b/controller/db/migrations.go @@ -23,7 +23,7 @@ import ( ) const ( - CurrentDbVersion = 35 + CurrentDbVersion = 36 FieldVersion = "version" ) @@ -165,6 +165,12 @@ func (m *Migrations) migrate(step *boltz.MigrationStep) int { step.SetError(m.stores.ConfigType.Update(step.Ctx, hostV2ConfigType, nil)) } + if step.CurrentVersion < 36 { + m.dropEntity(step, EntityTypeSessions) + m.dropEntity(step, EntityTypeApiSessions) + m.dropEntity(step, EntityTypeApiSessionCertificates) + } + // current version if step.CurrentVersion <= CurrentDbVersion { return CurrentDbVersion diff --git a/controller/model/api_session_certificate_manager.go b/controller/model/api_session_certificate_manager.go index e02d0d01b..2875ccfbe 100644 --- a/controller/model/api_session_certificate_manager.go +++ b/controller/model/api_session_certificate_manager.go @@ -18,7 +18,6 @@ package model import ( "crypto/x509" - "fmt" "github.com/openziti/ziti/common/cert" "github.com/openziti/ziti/controller/apierror" "github.com/openziti/ziti/controller/change" @@ -111,13 +110,18 @@ func (self *ApiSessionCertificateManager) Query(tx *bbolt.Tx, query string) (*Ap } func (self *ApiSessionCertificateManager) ReadByApiSessionId(tx *bbolt.Tx, apiSessionId string) ([]*ApiSessionCertificate, error) { - result, err := self.Query(tx, fmt.Sprintf(`apiSession = "%s"`, apiSessionId)) + var result []*ApiSessionCertificate - if err != nil { - return nil, err + certIds := self.env.GetStores().ApiSession.GetRelatedEntitiesIdList(tx, apiSessionId, db.EntityTypeApiSessionCertificates) + for _, key := range certIds { + apiSessionCert, err := self.readInTx(tx, key) + if err != nil { + return nil, err + } + result = append(result, apiSessionCert) } - return result.ApiSessionCertificates, nil + return result, nil } type ApiSessionCertificateListResult struct { diff --git a/tests/api_session_test.go b/tests/api_session_test.go index ee60e1e80..6d86c2b8a 100644 --- a/tests/api_session_test.go +++ b/tests/api_session_test.go @@ -1,5 +1,4 @@ //go:build apitests -// +build apitests /* Copyright NetFoundry Inc. From 5930b88f6be932952a6f878e4955f330b092770c Mon Sep 17 00:00:00 2001 From: Kenneth Bingham Date: Wed, 20 Mar 2024 13:29:03 -0400 Subject: [PATCH 21/29] use preferred, single address and port option vars --- .../docker/all-in-one/compose.override.yml | 18 ++++++++++++------ quickstart/docker/all-in-one/compose.yml | 13 +++++++------ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/quickstart/docker/all-in-one/compose.override.yml b/quickstart/docker/all-in-one/compose.override.yml index a6325b4de..7ba3ef0a3 100644 --- a/quickstart/docker/all-in-one/compose.override.yml +++ b/quickstart/docker/all-in-one/compose.override.yml @@ -25,12 +25,14 @@ services: GOFLAGS: "-tags=quickstart,manual" GOCACHE: /.cache/go-build GOPATH: /go - ZITI_PWD: - ZITI_CTRL_EDGE_ADVERTISED_ADDRESS: ${EXTERNAL_DNS:-quickstart} + ZITI_PWD: # default "admin" + ZITI_CTRL_ADVERTISED_ADDRESS: ${EXTERNAL_DNS:-quickstart} + ZITI_CTRL_EDGE_ADVERTISED_ADDRESS: ${EXTERNAL_DNS:-quickstart} # deprecated by ZITI_CTRL_ADVERTISED_ADDRESS + ZITI_CTRL_ADVERTISED_PORT: ${ZITI_CTRL_ADVERTISED_PORT:-1280} + ZITI_CTRL_EDGE_ADVERTISED_PORT: ${ZITI_CTRL_ADVERTISED_PORT:-1280} # deprecated by ZITI_CTRL_ADVERTISED_PORT ZITI_ROUTER_ADVERTISED_ADDRESS: ${EXTERNAL_DNS:-quickstart} - ZITI_CTRL_EDGE_ADVERTISED_PORT: + ZITI_ROUTER_PORT: ${ZITI_ROUTER_PORT:-3022} ZITI_ROUTER_NAME: ${ZITI_ROUTER_NAME:-quickstart-router} - ZITI_ROUTER_PORT: command: go test -v ./ziti/cmd/edge/... wait-for-login: @@ -39,6 +41,10 @@ services: image: ${ZITI_QUICK_IMAGE:-docker.io/openziti/ziti-cli}:${ZITI_QUICK_TAG:-latest} networks: - quickstart + # run as the same user as the host, so we can write in ~/.config/ziti + user: ${ZIGGY_UID:-1000} + environment: + HOME: /home/ziggy volumes: - ${ZITI_HOME:-ziti_home}:/home/ziggy entrypoint: @@ -48,7 +54,7 @@ services: set -o pipefail ATTEMPTS=10 DELAY=3 - until !((ATTEMPTS)) || ziti $${@} &>/dev/null; do + until !((ATTEMPTS)) || ziti $${@}; do (( ATTEMPTS-- )) echo "Waiting for controller to start" sleep $${DELAY} @@ -56,6 +62,6 @@ services: ziti $${@} command: > -- edge login - ${EXTERNAL_DNS:-quickstart}:${ZITI_CTRL_EDGE_ADVERTISED_PORT:-1280} + ${EXTERNAL_DNS:-quickstart}:${ZITI_CTRL_ADVERTISED_PORT:-1280} -u ${ZITI_USER:-admin} -p ${ZITI_PWD:-admin} --ca /home/ziggy/quickstart/pki/root-ca/certs/root-ca.cert diff --git a/quickstart/docker/all-in-one/compose.yml b/quickstart/docker/all-in-one/compose.yml index 75b445c35..8aa4a0893 100644 --- a/quickstart/docker/all-in-one/compose.yml +++ b/quickstart/docker/all-in-one/compose.yml @@ -21,9 +21,9 @@ services: - -euc - | ZITI_CMD+=" --ctrl-address ${EXTERNAL_DNS:-quickstart}"\ - " --ctrl-port ${ZITI_CTRL_EDGE_ADVERTISED_PORT:-1280}"\ + " --ctrl-port ${ZITI_CTRL_ADVERTISED_PORT:-1280}"\ " --router-address ${EXTERNAL_DNS:-quickstart}"\ - " --router-port ${ZITI_ROUTER_ADVERTISED_PORT:-3022}"\ + " --router-port ${ZITI_ROUTER_PORT:-3022}"\ " --password ${ZITI_PWD:-admin}" echo "DEBUG: run command is: ziti $${@} $${ZITI_CMD}" exec ziti "$${@}" $${ZITI_CMD} @@ -32,16 +32,17 @@ services: environment: HOME: /home/ziggy PFXLOG_NO_JSON: "${PFXLOG_NO_JSON:-true}" + ZITI_ROUTER_NAME: ${ZITI_ROUTER_NAME:-quickstart-router} volumes: # store the quickstart state in a named volume "ziti_home" or store the quickstart state on the Docker host in a # directory, ZITI_HOME - ${ZITI_HOME:-ziti_home}:/home/ziggy ports: - - ${ZITI_INTERFACE:-0.0.0.0}:${ZITI_CTRL_EDGE_ADVERTISED_PORT:-1280}:${ZITI_CTRL_EDGE_ADVERTISED_PORT:-1280} - - ${ZITI_INTERFACE:-0.0.0.0}:${ZITI_ROUTER_ADVERTISED_PORT:-3022}:${ZITI_ROUTER_ADVERTISED_PORT:-3022} + - ${ZITI_INTERFACE:-0.0.0.0}:${ZITI_CTRL_ADVERTISED_PORT:-1280}:${ZITI_CTRL_ADVERTISED_PORT:-1280} + - ${ZITI_INTERFACE:-0.0.0.0}:${ZITI_ROUTER_PORT:-3022}:${ZITI_ROUTER_PORT:-3022} expose: - - ${ZITI_CTRL_EDGE_ADVERTISED_PORT:-1280} - - ${ZITI_ROUTER_ADVERTISED_PORT:-3022} + - ${ZITI_CTRL_ADVERTISED_PORT:-1280} + - ${ZITI_ROUTER_PORT:-3022} depends_on: quickstart-init: condition: service_completed_successfully From 1e17a70d3ff2be88f47ab1eaa178c7001618f971 Mon Sep 17 00:00:00 2001 From: Paul Lorenz Date: Wed, 20 Mar 2024 14:02:18 -0400 Subject: [PATCH 22/29] Don't allow session sync to block channel. Fixes #1849 --- controller/server/controller.go | 2 +- controller/sync_strats/sync_instant.go | 31 ++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/controller/server/controller.go b/controller/server/controller.go index 541b05d4e..1526d2def 100644 --- a/controller/server/controller.go +++ b/controller/server/controller.go @@ -234,7 +234,7 @@ func (c *Controller) Initialize() { //after InitPersistence c.AppEnv.Broker = env.NewBroker(c.AppEnv, sync2.NewInstantStrategy(c.AppEnv, sync2.InstantStrategyOptions{ MaxQueuedRouterConnects: 100, - MaxQueuedClientHellos: 100, + MaxQueuedClientHellos: 1000, RouterConnectWorkerCount: 10, SyncWorkerCount: 10, RouterTxBufferSize: 100, diff --git a/controller/sync_strats/sync_instant.go b/controller/sync_strats/sync_instant.go index ca27cef83..a0cf5bcb1 100644 --- a/controller/sync_strats/sync_instant.go +++ b/controller/sync_strats/sync_instant.go @@ -528,7 +528,34 @@ func (strategy *InstantStrategy) ReceiveResync(routerId string, _ *edge_ctrl_pb. rtx.RouterModelIndex = nil - strategy.receivedClientHelloQueue <- rtx + strategy.queueClientHello(rtx) +} + +func (strategy *InstantStrategy) queueClientHello(rtx *RouterSender) { + select { + case strategy.receivedClientHelloQueue <- rtx: + return + default: + } + + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + + go func() { + for { + if ch := rtx.Router.Control; ch == nil || ch.IsClosed() { + return + } + + select { + case strategy.receivedClientHelloQueue <- rtx: + return + case <-strategy.stopNotify: + return + case <-ticker.C: + } + } + }() } func (strategy *InstantStrategy) ReceiveClientHello(routerId string, msg *channel.Message, respHello *edge_ctrl_pb.ClientHello) { @@ -589,7 +616,7 @@ func (strategy *InstantStrategy) ReceiveClientHello(routerId string, msg *channe serverVersion := build.GetBuildInfo().Version() logger.Infof("edge router sent hello with version [%s] to controller with version [%s]", respHello.Version, serverVersion) - strategy.receivedClientHelloQueue <- rtx + strategy.queueClientHello(rtx) } func (strategy *InstantStrategy) synchronize(rtx *RouterSender) { From a089ca7c36d7fe9a854210d2291bb8998a0c8ffb Mon Sep 17 00:00:00 2001 From: Paul Lorenz Date: Wed, 20 Mar 2024 14:23:15 -0400 Subject: [PATCH 23/29] Return dummy values in service list for posture checks if no posture checks are defined. Fixes #1576 --- controller/internal/routes/service_api_model.go | 15 ++++++++++++++- controller/model/edge_service_manager.go | 4 ++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/controller/internal/routes/service_api_model.go b/controller/internal/routes/service_api_model.go index 2f7fb0baf..de20a82d1 100644 --- a/controller/internal/routes/service_api_model.go +++ b/controller/internal/routes/service_api_model.go @@ -17,6 +17,7 @@ package routes import ( + "fmt" "github.com/michaelquigley/pfxlog" "github.com/openziti/edge-api/rest_model" "github.com/openziti/foundation/v2/stringz" @@ -148,8 +149,20 @@ func MapServiceToRestModel(ae *env.AppEnv, rc *response.RequestContext, service policyPostureCheckMap := ae.GetManagers().EdgeService.GetPolicyPostureChecks(rc.Identity.Id, *ret.ID) - for policyId, policyPostureChecks := range policyPostureCheckMap { + if len(policyPostureCheckMap) == 0 { + for _, permission := range ret.Permissions { + passing := true + id := fmt.Sprintf("dummy %s policy: no posture checks defined", strings.ToLower(string(permission))) + ret.PostureQueries = append(ret.PostureQueries, &rest_model.PostureQueries{ + PolicyID: &id, + PostureQueries: []*rest_model.PostureQuery{}, + PolicyType: permission, + IsPassing: &passing, + }) + } + } + for policyId, policyPostureChecks := range policyPostureCheckMap { isPolicyPassing := true policyIdCopy := policyId querySet := &rest_model.PostureQueries{ diff --git a/controller/model/edge_service_manager.go b/controller/model/edge_service_manager.go index 5918b45c3..378425f96 100644 --- a/controller/model/edge_service_manager.go +++ b/controller/model/edge_service_manager.go @@ -340,6 +340,10 @@ func (self *EdgeServiceManager) GetPolicyPostureChecks(identityId, serviceId str policyTypeSymbol := self.env.GetStores().ServicePolicy.GetSymbol(db.FieldServicePolicyType) _ = self.GetDb().View(func(tx *bbolt.Tx) error { + if !self.env.GetStores().PostureCheck.IterateIds(tx, ast.BoolNodeTrue).IsValid() { + return nil + } + policyCursor := self.env.GetStores().Identity.GetRelatedEntitiesCursor(tx, identityId, db.EntityTypeServicePolicies, true) policyCursor = ast.NewFilteredCursor(policyCursor, func(policyId []byte) bool { return serviceLinks.IsLinked(tx, policyId, []byte(serviceId)) From 3c3bfb69f72f4db0671de9af52dc8b8bc7cccabc Mon Sep 17 00:00:00 2001 From: Paul Lorenz Date: Thu, 21 Mar 2024 10:02:39 -0400 Subject: [PATCH 24/29] Fix panic if router is disconnected in unroute. Fixes #1854 --- controller/network/network.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/controller/network/network.go b/controller/network/network.go index 6808bc56d..f6755a2ce 100644 --- a/controller/network/network.go +++ b/controller/network/network.go @@ -594,14 +594,14 @@ func (network *Network) CreateCircuit(params CreateCircuitParams) (*Circuit, err // revert successful routes logger.Warnf("circuit creation failed after [%d] attempts, sending cleanup unroutes", network.options.CreateCircuitRetries) for cleanupRId := range allCleanups { - if r, err := network.GetRouter(cleanupRId); err == nil { + if r := network.GetConnectedRouter(cleanupRId); r != nil { if err := sendUnroute(r, circuitId, true); err == nil { logger.WithField("routerId", cleanupRId).Debug("sent cleanup unroute for circuit") } else { logger.WithField("routerId", cleanupRId).Error("error sending cleanup unroute for circuit") } } else { - logger.WithField("routerId", cleanupRId).Error("missing router for circuit cleanup") + logger.WithField("routerId", cleanupRId).Error("router for circuit cleanup not connected") } } @@ -618,14 +618,14 @@ func (network *Network) CreateCircuit(params CreateCircuitParams) (*Circuit, err for cleanupRId := range allCleanups { if _, found := usedRouters[cleanupRId]; !found { cleanupCount++ - if r, err := network.GetRouter(cleanupRId); err == nil { + if r := network.GetConnectedRouter(cleanupRId); r != nil { if err := sendUnroute(r, circuitId, true); err == nil { logger.WithField("routerId", cleanupRId).Debug("sent abandoned cleanup unroute for circuit to router") } else { logger.WithField("routerId", cleanupRId).WithError(err).Error("error sending abandoned cleanup unroute for circuit to router") } } else { - logger.WithField("routerId", cleanupRId).Error("missing router for circuit, abandoned cleanup") + logger.WithField("routerId", cleanupRId).Error("router not connected for circuit, abandoned cleanup") } } } From 881ec14b63ad2946911436f7d0c7f42d769acc09 Mon Sep 17 00:00:00 2001 From: Paul Lorenz Date: Wed, 20 Mar 2024 22:26:30 -0400 Subject: [PATCH 25/29] Fix validation perf. Fixes #1428. Remove duplicate LoadOneById method. --- controller/db/api_session_store.go | 2 +- controller/db/api_session_store_test.go | 6 +-- controller/db/base_store.go | 20 --------- controller/db/config_store_test.go | 2 +- controller/db/config_type_store.go | 2 +- controller/db/edge_router_policy_store.go | 2 +- .../db/edge_router_policy_store_test.go | 2 +- controller/db/edge_router_store.go | 4 +- controller/db/edge_service_store.go | 2 +- controller/db/edge_service_store_test.go | 8 ++-- controller/db/enrollment_store.go | 2 +- controller/db/eventual_eventer.go | 2 +- controller/db/identity_store.go | 6 +-- controller/db/migration_v16.go | 4 +- controller/db/migration_v18.go | 2 +- controller/db/migration_v19.go | 4 +- controller/db/migration_v24.go | 4 +- controller/db/policy_common.go | 43 +++++++++++-------- controller/db/posture_check_store.go | 3 +- .../db/service_edge_router_policy_store.go | 2 +- .../service_edge_router_policy_store_test.go | 2 +- controller/db/service_policy_store.go | 2 +- controller/db/service_policy_store_test.go | 2 +- controller/db/session_store.go | 4 +- controller/db/session_store_test.go | 8 ++-- controller/db/transit_router_store.go | 2 +- controller/env/broker.go | 2 +- .../policy/service_policy_enforcer.go | 6 +-- .../model/api_session_certificate_model.go | 2 +- controller/model/api_session_model.go | 2 +- controller/model/authenticator_manager.go | 4 +- controller/model/authenticator_mod_ext_jwt.go | 2 +- controller/model/create_terminator_cmd.go | 2 +- controller/model/edge_service_manager.go | 2 +- controller/model/edge_service_model.go | 4 +- controller/model/mfa_model.go | 2 +- controller/model/policy_advisor.go | 2 +- controller/model/posture_response_manager.go | 4 +- controller/model/posture_response_model.go | 2 +- controller/model/session_model.go | 2 +- controller/sync_strats/sync_instant.go | 12 +++--- ziti/cmd/database/add_debug_admin.go | 2 +- zititest/zitilab/models/db_builder.go | 2 +- 43 files changed, 90 insertions(+), 106 deletions(-) diff --git a/controller/db/api_session_store.go b/controller/db/api_session_store.go index 52e6c4b95..cf427bb38 100644 --- a/controller/db/api_session_store.go +++ b/controller/db/api_session_store.go @@ -257,7 +257,7 @@ func (store *apiSessionStoreImpl) initializeLinked() { func (store *apiSessionStoreImpl) LoadOneByToken(tx *bbolt.Tx, token string) (*ApiSession, error) { id := store.indexToken.Read(tx, []byte(token)) if id != nil { - return store.LoadOneById(tx, string(id)) + return store.LoadById(tx, string(id)) } return nil, boltz.NewNotFoundError(store.GetSingularEntityType(), "token", token) } diff --git a/controller/db/api_session_store_test.go b/controller/db/api_session_store_test.go index 34fa8db7c..7430842c8 100644 --- a/controller/db/api_session_store_test.go +++ b/controller/db/api_session_store_test.go @@ -178,11 +178,11 @@ func (ctx *TestContext) testUpdateApiSessions(t *testing.T) { mutateCtx := change.New().NewMutateContext() err := ctx.GetDb().Update(mutateCtx, func(mutateCtx boltz.MutateContext) error { tx := mutateCtx.Tx() - original, err := ctx.stores.ApiSession.LoadOneById(tx, entities.apiSession1.Id) + original, err := ctx.stores.ApiSession.LoadById(tx, entities.apiSession1.Id) ctx.NoError(err) ctx.NotNil(original) - apiSession, err := ctx.stores.ApiSession.LoadOneById(tx, entities.apiSession1.Id) + apiSession, err := ctx.stores.ApiSession.LoadById(tx, entities.apiSession1.Id) ctx.NoError(err) ctx.NotNil(apiSession) @@ -196,7 +196,7 @@ func (ctx *TestContext) testUpdateApiSessions(t *testing.T) { err = ctx.stores.ApiSession.Update(mutateCtx, apiSession, nil) ctx.NoError(err) - loaded, err := ctx.stores.ApiSession.LoadOneById(tx, entities.apiSession1.Id) + loaded, err := ctx.stores.ApiSession.LoadById(tx, entities.apiSession1.Id) ctx.NoError(err) ctx.NotNil(loaded) ctx.EqualValues(original.CreatedAt, loaded.CreatedAt) diff --git a/controller/db/base_store.go b/controller/db/base_store.go index dde2c136a..f9cc01005 100644 --- a/controller/db/base_store.go +++ b/controller/db/base_store.go @@ -34,7 +34,6 @@ type initializableStore interface { type Store[E boltz.ExtEntity] interface { boltz.EntityStore[E] initializableStore - LoadOneById(tx *bbolt.Tx, id string) (E, error) } type baseStore[E boltz.ExtEntity] struct { @@ -51,25 +50,6 @@ func (store *baseStore[E]) initializeIndexes(tx *bbolt.Tx, errorHolder errorz.Er store.InitializeIndexes(tx, errorHolder) } -func (store *baseStore[E]) LoadOneById(tx *bbolt.Tx, id string) (E, error) { - entity := store.NewStoreEntity() - if err := store.baseLoadOneById(tx, id, entity); err != nil { - return *new(E), err - } - return entity, nil -} - -func (store *baseStore[E]) baseLoadOneById(tx *bbolt.Tx, id string, entity E) error { - found, err := store.LoadEntity(tx, id, entity) - if err != nil { - return err - } - if !found { - return boltz.NewNotFoundError(store.GetSingularEntityType(), "id", id) - } - return nil -} - func (store *baseStore[E]) deleteEntityReferences(tx *bbolt.Tx, entity boltz.NamedExtEntity, rolesSymbol boltz.EntitySetSymbol) error { idRef := entityRef(entity.GetId()) diff --git a/controller/db/config_store_test.go b/controller/db/config_store_test.go index c61fbc8af..d928322f5 100644 --- a/controller/db/config_store_test.go +++ b/controller/db/config_store_test.go @@ -64,7 +64,7 @@ func (ctx *TestContext) testConfigCrud(*testing.T) { boltztest.ValidateBaseline(ctx, config) err = ctx.GetDb().View(func(tx *bbolt.Tx) error { - testConfig, err := ctx.stores.Config.LoadOneById(tx, config.Id) + testConfig, err := ctx.stores.Config.LoadById(tx, config.Id) ctx.NoError(err) ctx.NotNil(testConfig) ctx.Equal(config.Name, testConfig.Name) diff --git a/controller/db/config_type_store.go b/controller/db/config_type_store.go index 56345f14f..526119b10 100644 --- a/controller/db/config_type_store.go +++ b/controller/db/config_type_store.go @@ -120,7 +120,7 @@ func (store *configTypeStoreImpl) PersistEntity(entity *ConfigType, ctx *boltz.P func (store *configTypeStoreImpl) LoadOneByName(tx *bbolt.Tx, name string) (*ConfigType, error) { id := store.indexName.Read(tx, []byte(name)) if id != nil { - return store.LoadOneById(tx, string(id)) + return store.LoadById(tx, string(id)) } return nil, nil } diff --git a/controller/db/edge_router_policy_store.go b/controller/db/edge_router_policy_store.go index b1cb6a14a..0c4d9432b 100644 --- a/controller/db/edge_router_policy_store.go +++ b/controller/db/edge_router_policy_store.go @@ -164,7 +164,7 @@ func (store *edgeRouterPolicyStoreImpl) identityRolesUpdated(persistCtx *boltz.P } func (store *edgeRouterPolicyStoreImpl) DeleteById(ctx boltz.MutateContext, id string) error { - policy, err := store.LoadOneById(ctx.Tx(), id) + policy, err := store.LoadById(ctx.Tx(), id) if err != nil { return err } diff --git a/controller/db/edge_router_policy_store_test.go b/controller/db/edge_router_policy_store_test.go index b5d55c216..015760591 100644 --- a/controller/db/edge_router_policy_store_test.go +++ b/controller/db/edge_router_policy_store_test.go @@ -38,7 +38,7 @@ func (ctx *TestContext) testCreateEdgeRouterPolicy(t *testing.T) { ctx.Equal(0, len(ctx.stores.EdgeRouterPolicy.GetRelatedEntitiesIdList(tx, policy.Id, EntityTypeRouters))) ctx.Equal(0, len(ctx.stores.EdgeRouterPolicy.GetRelatedEntitiesIdList(tx, policy.Id, EntityTypeIdentities))) - testPolicy, err := ctx.stores.EdgeRouterPolicy.LoadOneById(tx, policy.Id) + testPolicy, err := ctx.stores.EdgeRouterPolicy.LoadById(tx, policy.Id) ctx.NoError(err) ctx.NotNil(testPolicy) ctx.Equal(policy.Name, testPolicy.Name) diff --git a/controller/db/edge_router_store.go b/controller/db/edge_router_store.go index a35ebbc0e..7505e333e 100644 --- a/controller/db/edge_router_store.go +++ b/controller/db/edge_router_store.go @@ -231,7 +231,7 @@ func (store *edgeRouterStoreImpl) GetNameIndex() boltz.ReadIndex { } func (store *edgeRouterStoreImpl) cleanupEdgeRouter(ctx boltz.MutateContext, id string) error { - if entity, _ := store.LoadOneById(ctx.Tx(), id); entity != nil { + if entity, _ := store.LoadById(ctx.Tx(), id); entity != nil { // Remove entity from EdgeRouterRoles in edge router policies if err := store.deleteEntityReferences(ctx.Tx(), entity, store.stores.edgeRouterPolicy.symbolEdgeRouterRoles); err != nil { return err @@ -311,7 +311,7 @@ func (self *routerIdentityConstraint) ProcessAfterUpdate(ctx *boltz.IndexingCont } if !createEntities && currentTunnelerEnabled && oldName != name { - identity, err := self.stores.identity.LoadOneById(ctx.Tx(), routerId) + identity, err := self.stores.identity.LoadById(ctx.Tx(), routerId) if err != nil { if boltz.IsErrNotFoundErr(err) { logrus.Errorf("identity for router with id %v not found", routerId) diff --git a/controller/db/edge_service_store.go b/controller/db/edge_service_store.go index 968f5726c..50242bad5 100644 --- a/controller/db/edge_service_store.go +++ b/controller/db/edge_service_store.go @@ -251,7 +251,7 @@ func (store *edgeServiceStoreImpl) Update(ctx boltz.MutateContext, entity *EdgeS } func (store *edgeServiceStoreImpl) cleanupEdgeService(ctx boltz.MutateContext, id string) error { - if entity, _ := store.LoadOneById(ctx.Tx(), id); entity != nil { + if entity, _ := store.LoadById(ctx.Tx(), id); entity != nil { // Remove entity from ServiceRoles in service policies if err := store.deleteEntityReferences(ctx.Tx(), entity, store.stores.servicePolicy.symbolServiceRoles); err != nil { return err diff --git a/controller/db/edge_service_store_test.go b/controller/db/edge_service_store_test.go index 45a9c05e0..8946d1b00 100644 --- a/controller/db/edge_service_store_test.go +++ b/controller/db/edge_service_store_test.go @@ -181,7 +181,7 @@ func (ctx *TestContext) testLoadQueryEdgeServices(_ *testing.T) { entities := ctx.createEdgeServiceTestEntities() err := ctx.GetDb().View(func(tx *bbolt.Tx) error { - service, err := ctx.stores.EdgeService.LoadOneById(tx, entities.service1.Id) + service, err := ctx.stores.EdgeService.LoadById(tx, entities.service1.Id) ctx.NoError(err) ctx.NotNil(service) ctx.EqualValues(entities.service1.Id, service.Id) @@ -217,11 +217,11 @@ func (ctx *TestContext) testUpdateEdgeServices(_ *testing.T) { mutateCtx := change.New().NewMutateContext() err := ctx.GetDb().Update(mutateCtx, func(mutateCtx boltz.MutateContext) error { tx := mutateCtx.Tx() - original, err := ctx.stores.EdgeService.LoadOneById(tx, entities.service1.Id) + original, err := ctx.stores.EdgeService.LoadById(tx, entities.service1.Id) ctx.NoError(err) ctx.NotNil(original) - service, err := ctx.stores.EdgeService.LoadOneById(tx, entities.service1.Id) + service, err := ctx.stores.EdgeService.LoadById(tx, entities.service1.Id) ctx.NoError(err) ctx.NotNil(service) @@ -234,7 +234,7 @@ func (ctx *TestContext) testUpdateEdgeServices(_ *testing.T) { err = ctx.stores.EdgeService.Update(mutateCtx, service, nil) ctx.NoError(err) - loaded, err := ctx.stores.EdgeService.LoadOneById(tx, entities.service1.Id) + loaded, err := ctx.stores.EdgeService.LoadById(tx, entities.service1.Id) ctx.NoError(err) ctx.NotNil(loaded) ctx.EqualValues(original.CreatedAt, loaded.CreatedAt) diff --git a/controller/db/enrollment_store.go b/controller/db/enrollment_store.go index 06a5ad9e9..0f8ff4238 100644 --- a/controller/db/enrollment_store.go +++ b/controller/db/enrollment_store.go @@ -142,7 +142,7 @@ func (store *enrollmentStoreImpl) PersistEntity(entity *Enrollment, ctx *boltz.P func (store *enrollmentStoreImpl) LoadOneByToken(tx *bbolt.Tx, token string) (*Enrollment, error) { id := store.tokenIndex.Read(tx, []byte(token)) if id != nil { - return store.LoadOneById(tx, string(id)) + return store.LoadById(tx, string(id)) } return nil, nil } diff --git a/controller/db/eventual_eventer.go b/controller/db/eventual_eventer.go index 805853bad..ba19cd545 100644 --- a/controller/db/eventual_eventer.go +++ b/controller/db/eventual_eventer.go @@ -489,7 +489,7 @@ func (a *EventualEventerBbolt) getEventualEvents() ([]string, []*EventualEvent, } for _, id := range ids { - event, err := a.store.LoadOneById(tx, id) + event, err := a.store.LoadById(tx, id) if err != nil { pfxlog.Logger().WithField("id", id).WithError(err).Errorf("error could not load event id %s", id) diff --git a/controller/db/identity_store.go b/controller/db/identity_store.go index be12570f5..f7be28f40 100644 --- a/controller/db/identity_store.go +++ b/controller/db/identity_store.go @@ -400,7 +400,7 @@ func (store *identityStoreImpl) DeleteById(ctx boltz.MutateContext, id string) e } } - if entity, _ := store.LoadOneById(ctx.Tx(), id); entity != nil { + if entity, _ := store.LoadById(ctx.Tx(), id); entity != nil { if entity.IsDefaultAdmin { return errorz.NewEntityCanNotBeDeleted() } @@ -444,7 +444,7 @@ func (store *identityStoreImpl) AssignServiceConfigs(tx *bbolt.Tx, identityId st } configTypes := map[string]struct{}{} for _, serviceConfig := range serviceConfigs { - config, err := store.stores.config.LoadOneById(tx, serviceConfig.ConfigId) + config, err := store.stores.config.LoadById(tx, serviceConfig.ConfigId) if err != nil { return err } @@ -625,7 +625,7 @@ func (store *identityStoreImpl) LoadServiceConfigsByServiceAndType(tx *bbolt.Tx, _, wantsType = configTypes[configTypeId] } if wantsType { - if config, _ := store.stores.config.LoadOneById(tx, configId); config != nil { + if config, _ := store.stores.config.LoadById(tx, configId); config != nil { serviceMap, ok := result[serviceId] if !ok { serviceMap = map[string]map[string]interface{}{} diff --git a/controller/db/migration_v16.go b/controller/db/migration_v16.go index 1e5b00193..7c6b7375f 100644 --- a/controller/db/migration_v16.go +++ b/controller/db/migration_v16.go @@ -15,7 +15,7 @@ func (m *Migrations) removeOrphanedOttCaEnrollments(step *boltz.MigrationStep) { current := cursor.Current() currentEnrollmentId := string(current) - enrollment, err := m.stores.Enrollment.LoadOneById(step.Ctx.Tx(), currentEnrollmentId) + enrollment, err := m.stores.Enrollment.LoadById(step.Ctx.Tx(), currentEnrollmentId) if err != nil { step.SetError(fmt.Errorf("error iterating ids of enrollments, enrollment [%s]: %v", currentEnrollmentId, err)) @@ -23,7 +23,7 @@ func (m *Migrations) removeOrphanedOttCaEnrollments(step *boltz.MigrationStep) { } if enrollment.CaId != nil && *enrollment.CaId != "" { - _, err := m.stores.Ca.LoadOneById(step.Ctx.Tx(), *enrollment.CaId) + _, err := m.stores.Ca.LoadById(step.Ctx.Tx(), *enrollment.CaId) if err != nil && boltz.IsErrNotFoundErr(err) { enrollmentsToDelete = append(enrollmentsToDelete, currentEnrollmentId) diff --git a/controller/db/migration_v18.go b/controller/db/migration_v18.go index d99b96ed3..c63eb6c97 100644 --- a/controller/db/migration_v18.go +++ b/controller/db/migration_v18.go @@ -8,7 +8,7 @@ import ( // Primes API Session's lastActivityAt proper to their previous updatedAt value func (m *Migrations) setLastActivityAt(step *boltz.MigrationStep) { for cursor := m.stores.ApiSession.IterateIds(step.Ctx.Tx(), ast.BoolNodeTrue); cursor.IsValid(); cursor.Next() { - if apiSession, err := m.stores.ApiSession.LoadOneById(step.Ctx.Tx(), string(cursor.Current())); err == nil { + if apiSession, err := m.stores.ApiSession.LoadById(step.Ctx.Tx(), string(cursor.Current())); err == nil { apiSession.LastActivityAt = apiSession.UpdatedAt step.SetError(m.stores.ApiSession.Update(step.Ctx, apiSession, UpdateLastActivityAtChecker{})) } else { diff --git a/controller/db/migration_v19.go b/controller/db/migration_v19.go index 189665ecf..a2eecd878 100644 --- a/controller/db/migration_v19.go +++ b/controller/db/migration_v19.go @@ -35,7 +35,7 @@ func (m *Migrations) updateIdentityTypes(step *boltz.MigrationStep) { for cursor := identityStore.IterateIds(step.Ctx.Tx(), ast.BoolNodeTrue); cursor.IsValid(); cursor.Next() { current := cursor.Current() - identity, err := identityStore.LoadOneById(step.Ctx.Tx(), string(current)) + identity, err := identityStore.LoadById(step.Ctx.Tx(), string(current)) if step.SetError(err) { return } @@ -64,7 +64,7 @@ func (m *Migrations) updateIdentityTypes(step *boltz.MigrationStep) { } func (m *Migrations) migrateIdentityType(step *boltz.MigrationStep, id string) { - idType, err := m.stores.IdentityType.LoadOneById(step.Ctx.Tx(), id) + idType, err := m.stores.IdentityType.LoadById(step.Ctx.Tx(), id) if step.SetError(err) { return } diff --git a/controller/db/migration_v24.go b/controller/db/migration_v24.go index a043c2af2..32c79af5c 100644 --- a/controller/db/migration_v24.go +++ b/controller/db/migration_v24.go @@ -15,7 +15,7 @@ func (m *Migrations) addIdentityIdToSessions(step *boltz.MigrationStep) { for cursor.IsValid() { sessionId := string(cursor.Current()) - session, err := m.stores.Session.LoadOneById(step.Ctx.Tx(), sessionId) + session, err := m.stores.Session.LoadById(step.Ctx.Tx(), sessionId) if err != nil { step.SetError(fmt.Errorf("could no load session by id [%s]: %v", sessionId, err)) @@ -28,7 +28,7 @@ func (m *Migrations) addIdentityIdToSessions(step *boltz.MigrationStep) { } if session.IdentityId == "" { - if apiSession, err := m.stores.ApiSession.LoadOneById(step.Ctx.Tx(), session.ApiSessionId); err == nil { + if apiSession, err := m.stores.ApiSession.LoadById(step.Ctx.Tx(), session.ApiSessionId); err == nil { if apiSession != nil { session.IdentityId = apiSession.IdentityId if err = m.stores.Session.Update(step.Ctx, session, fieldChecker); err != nil { diff --git a/controller/db/policy_common.go b/controller/db/policy_common.go index 7607d3ac9..0a89f9f41 100644 --- a/controller/db/policy_common.go +++ b/controller/db/policy_common.go @@ -1,7 +1,6 @@ package db import ( - "bytes" "fmt" "github.com/michaelquigley/pfxlog" "github.com/openziti/foundation/v2/errorz" @@ -311,24 +310,36 @@ type denormCheckCtx struct { func validatePolicyDenormalization(ctx *denormCheckCtx) error { tx := ctx.mutateCtx.Tx() + + links := map[string]map[string]int{} + + for policyCursor := ctx.policyStore.IterateIds(tx, ast.BoolNodeTrue); policyCursor.IsValid(); policyCursor.Next() { + policyId := policyCursor.Current() + if ctx.policyFilter == nil || ctx.policyFilter(policyId) { + for sourceCursor := ctx.sourceCollection.IterateLinks(tx, policyId); sourceCursor.IsValid(); sourceCursor.Next() { + sourceId := string(sourceCursor.Current()) + for destCursor := ctx.targetCollection.IterateLinks(tx, policyId); destCursor.IsValid(); destCursor.Next() { + destId := string(destCursor.Current()) + destMap := links[sourceId] + if destMap == nil { + destMap = map[string]int{} + links[sourceId] = destMap + } + destMap[destId] = destMap[destId] + 1 + } + } + } + } + for sourceCursor := ctx.sourceStore.IterateIds(tx, ast.BoolNodeTrue); sourceCursor.IsValid(); sourceCursor.Next() { sourceEntityId := sourceCursor.Current() for targetCursor := ctx.targetStore.IterateIds(tx, ast.BoolNodeTrue); targetCursor.IsValid(); targetCursor.Next() { targetEntityId := targetCursor.Current() - var relatedPolicies []string - - for policyCursor := ctx.policyStore.IterateIds(tx, ast.BoolNodeTrue); policyCursor.IsValid(); policyCursor.Next() { - policyId := policyCursor.Current() - if ctx.policyFilter == nil || ctx.policyFilter(policyId) { - sourceRelated := isRelatedByLinkCollection(tx, ctx.sourceCollection, policyId, sourceEntityId) - targetRelated := isRelatedByLinkCollection(tx, ctx.targetCollection, policyId, targetEntityId) - if sourceRelated && targetRelated { - relatedPolicies = append(relatedPolicies, string(policyId)) - } - } + linkCount := 0 + if destMap, ok := links[string(sourceEntityId)]; ok { + linkCount = destMap[string(targetEntityId)] } - linkCount := len(relatedPolicies) var sourceLinkCount, targetLinkCount *int32 var err error if ctx.repair { @@ -367,9 +378,3 @@ func logDiscrepencies(ctx *denormCheckCtx, count int, sourceId, targetId []byte, ctx.errorSink(err, ctx.repair) } } - -func isRelatedByLinkCollection(tx *bbolt.Tx, linkCollection boltz.LinkCollection, entityId, relatedId []byte) bool { - cursor := linkCollection.IterateLinks(tx, entityId) - cursor.Seek(relatedId) - return bytes.Equal(cursor.Current(), relatedId) -} diff --git a/controller/db/posture_check_store.go b/controller/db/posture_check_store.go index 8e8890e6f..eb15b4cbd 100644 --- a/controller/db/posture_check_store.go +++ b/controller/db/posture_check_store.go @@ -83,7 +83,6 @@ func (entity *PostureCheck) GetEntityType() string { type PostureCheckStore interface { Store[*PostureCheck] - LoadOneById(tx *bbolt.Tx, id string) (*PostureCheck, error) GetRoleAttributesIndex() boltz.SetReadIndex GetRoleAttributesCursorProvider(filters []string, semantic string) (ast.SetCursorProvider, error) } @@ -180,7 +179,7 @@ func (store *postureCheckStoreImpl) GetNameIndex() boltz.ReadIndex { } func (store *postureCheckStoreImpl) DeleteById(ctx boltz.MutateContext, id string) error { - if entity, _ := store.LoadOneById(ctx.Tx(), id); entity != nil { + if entity, _ := store.LoadById(ctx.Tx(), id); entity != nil { // Remove entity from PostureCheckRoles in service policies if err := store.deleteEntityReferences(ctx.Tx(), entity, store.stores.servicePolicy.symbolPostureCheckRoles); err != nil { return err diff --git a/controller/db/service_edge_router_policy_store.go b/controller/db/service_edge_router_policy_store.go index 28ddf12cc..8d4ce9c00 100644 --- a/controller/db/service_edge_router_policy_store.go +++ b/controller/db/service_edge_router_policy_store.go @@ -163,7 +163,7 @@ func (store *serviceEdgeRouterPolicyStoreImpl) serviceRolesUpdated(persistCtx *b } func (store *serviceEdgeRouterPolicyStoreImpl) DeleteById(ctx boltz.MutateContext, id string) error { - policy, err := store.LoadOneById(ctx.Tx(), id) + policy, err := store.LoadById(ctx.Tx(), id) if err != nil { return err } diff --git a/controller/db/service_edge_router_policy_store_test.go b/controller/db/service_edge_router_policy_store_test.go index 8af741bf0..d33dfa2b7 100644 --- a/controller/db/service_edge_router_policy_store_test.go +++ b/controller/db/service_edge_router_policy_store_test.go @@ -33,7 +33,7 @@ func (ctx *TestContext) testCreateServiceEdgeRouterPolicy(_ *testing.T) { ctx.Equal(0, len(ctx.stores.ServiceEdgeRouterPolicy.GetRelatedEntitiesIdList(tx, policy.Id, EntityTypeRouters))) ctx.Equal(0, len(ctx.stores.ServiceEdgeRouterPolicy.GetRelatedEntitiesIdList(tx, policy.Id, EntityTypeServices))) - testPolicy, err := ctx.stores.ServiceEdgeRouterPolicy.LoadOneById(tx, policy.Id) + testPolicy, err := ctx.stores.ServiceEdgeRouterPolicy.LoadById(tx, policy.Id) ctx.NoError(err) ctx.NotNil(testPolicy) ctx.Equal(policy.Name, testPolicy.Name) diff --git a/controller/db/service_policy_store.go b/controller/db/service_policy_store.go index 28c70e185..7e67b6009 100644 --- a/controller/db/service_policy_store.go +++ b/controller/db/service_policy_store.go @@ -274,7 +274,7 @@ func (store *servicePolicyStoreImpl) postureCheckRolesUpdated(persistCtx *boltz. } func (store *servicePolicyStoreImpl) DeleteById(ctx boltz.MutateContext, id string) error { - policy, err := store.LoadOneById(ctx.Tx(), id) + policy, err := store.LoadById(ctx.Tx(), id) if err != nil { return err } diff --git a/controller/db/service_policy_store_test.go b/controller/db/service_policy_store_test.go index 87e170a79..1f26a7990 100644 --- a/controller/db/service_policy_store_test.go +++ b/controller/db/service_policy_store_test.go @@ -49,7 +49,7 @@ func (ctx *TestContext) testCreateServicePolicy(_ *testing.T) { ctx.Equal(0, len(ctx.stores.ServicePolicy.GetRelatedEntitiesIdList(tx, policy.Id, EntityTypeServices))) ctx.Equal(0, len(ctx.stores.ServicePolicy.GetRelatedEntitiesIdList(tx, policy.Id, EntityTypeIdentities))) - testPolicy, err := ctx.stores.ServicePolicy.LoadOneById(tx, policy.Id) + testPolicy, err := ctx.stores.ServicePolicy.LoadById(tx, policy.Id) ctx.NoError(err) ctx.NotNil(testPolicy) ctx.Equal(policy.Name, testPolicy.Name) diff --git a/controller/db/session_store.go b/controller/db/session_store.go index c24689275..57f8fbcf4 100644 --- a/controller/db/session_store.go +++ b/controller/db/session_store.go @@ -145,14 +145,14 @@ func (*sessionStoreImpl) PersistEntity(entity *Session, ctx *boltz.PersistContex ctx.SetStringList(FieldSessionServicePolicies, entity.ServicePolicies) if entity.ApiSession == nil { - entity.ApiSession, _ = ctx.Store.(*sessionStoreImpl).stores.apiSession.LoadOneById(ctx.Bucket.Tx(), entity.ApiSessionId) + entity.ApiSession, _ = ctx.Store.(*sessionStoreImpl).stores.apiSession.LoadById(ctx.Bucket.Tx(), entity.ApiSessionId) } } func (store *sessionStoreImpl) LoadOneByToken(tx *bbolt.Tx, token string) (*Session, error) { id := store.indexToken.Read(tx, []byte(token)) if id != nil { - return store.LoadOneById(tx, string(id)) + return store.LoadById(tx, string(id)) } return nil, boltz.NewNotFoundError(store.GetSingularEntityType(), "token", token) } diff --git a/controller/db/session_store_test.go b/controller/db/session_store_test.go index 8cea0cca2..c6dc3264c 100644 --- a/controller/db/session_store_test.go +++ b/controller/db/session_store_test.go @@ -100,7 +100,7 @@ func (ctx *TestContext) testUpdateInvalidSessions(_ *testing.T) { boltztest.RequireUpdate(ctx, session) err := ctx.GetDb().View(func(tx *bbolt.Tx) error { - loaded, err := ctx.stores.Session.LoadOneById(tx, session.Id) + loaded, err := ctx.stores.Session.LoadById(tx, session.Id) ctx.NoError(err) ctx.NotNil(loaded) ctx.Equal(apiSession.Id, loaded.ApiSessionId) @@ -236,11 +236,11 @@ func (ctx *TestContext) testUpdateSessions(_ *testing.T) { mutateCtx := change.New().NewMutateContext() err := ctx.GetDb().Update(mutateCtx, func(mutateCtx boltz.MutateContext) error { tx := mutateCtx.Tx() - original, err := ctx.stores.Session.LoadOneById(tx, entities.session1.Id) + original, err := ctx.stores.Session.LoadById(tx, entities.session1.Id) ctx.NoError(err) ctx.NotNil(original) - session, err := ctx.stores.Session.LoadOneById(tx, entities.session1.Id) + session, err := ctx.stores.Session.LoadById(tx, entities.session1.Id) ctx.NoError(err) ctx.NotNil(session) @@ -252,7 +252,7 @@ func (ctx *TestContext) testUpdateSessions(_ *testing.T) { err = ctx.stores.Session.Update(mutateCtx, session, nil) ctx.NoError(err) - loaded, err := ctx.stores.Session.LoadOneById(tx, entities.session1.Id) + loaded, err := ctx.stores.Session.LoadById(tx, entities.session1.Id) ctx.NoError(err) ctx.NotNil(loaded) ctx.EqualValues(original.CreatedAt, loaded.CreatedAt) diff --git a/controller/db/transit_router_store.go b/controller/db/transit_router_store.go index 8ede0de8b..9796e0fe2 100644 --- a/controller/db/transit_router_store.go +++ b/controller/db/transit_router_store.go @@ -133,7 +133,7 @@ func (store *transitRouterStoreImpl) PersistEntity(entity *TransitRouter, ctx *b } func (store *transitRouterStoreImpl) cleanupEnrollments(ctx boltz.MutateContext, id string) error { - if entity, _ := store.LoadOneById(ctx.Tx(), id); entity != nil { + if entity, _ := store.LoadById(ctx.Tx(), id); entity != nil { // Remove outstanding enrollments if err := store.stores.enrollment.DeleteWhere(ctx, fmt.Sprintf(`transitRouter="%s"`, entity.Id)); err != nil { return err diff --git a/controller/env/broker.go b/controller/env/broker.go index e92479562..162c8d187 100644 --- a/controller/env/broker.go +++ b/controller/env/broker.go @@ -159,7 +159,7 @@ func (broker *Broker) apiSessionCertificateHandler(delete bool, apiSessionCert * var apiSession *db.ApiSession var err error err = broker.ae.GetDbProvider().GetDb().View(func(tx *bbolt.Tx) error { - apiSession, err = broker.ae.GetStores().ApiSession.LoadOneById(tx, apiSessionCert.ApiSessionId) + apiSession, err = broker.ae.GetStores().ApiSession.LoadById(tx, apiSessionCert.ApiSessionId) return err }) diff --git a/controller/internal/policy/service_policy_enforcer.go b/controller/internal/policy/service_policy_enforcer.go index 9b0189b35..0a624f016 100644 --- a/controller/internal/policy/service_policy_enforcer.go +++ b/controller/internal/policy/service_policy_enforcer.go @@ -78,7 +78,7 @@ func (enforcer *ServicePolicyEnforcer) handleServiceEvent(event *db.ServiceEvent var sessionsToDelete []string err := enforcer.appEnv.GetDbProvider().GetDb().View(func(tx *bbolt.Tx) error { - identity, err := enforcer.appEnv.GetStores().Identity.LoadOneById(tx, event.IdentityId) + identity, err := enforcer.appEnv.GetStores().Identity.LoadById(tx, event.IdentityId) if err != nil { return err } @@ -134,12 +134,12 @@ func (enforcer *ServicePolicyEnforcer) Run() error { var sessionsToRemove []string err = enforcer.appEnv.GetDbProvider().GetDb().View(func(tx *bbolt.Tx) error { for _, session := range result.Sessions { - apiSession, err := enforcer.appEnv.GetStores().ApiSession.LoadOneById(tx, session.ApiSessionId) + apiSession, err := enforcer.appEnv.GetStores().ApiSession.LoadById(tx, session.ApiSessionId) if err != nil { return err } - identity, err := enforcer.appEnv.GetStores().Identity.LoadOneById(tx, apiSession.IdentityId) + identity, err := enforcer.appEnv.GetStores().Identity.LoadById(tx, apiSession.IdentityId) if err != nil { return err } diff --git a/controller/model/api_session_certificate_model.go b/controller/model/api_session_certificate_model.go index 6f2d32553..51cb0854e 100644 --- a/controller/model/api_session_certificate_model.go +++ b/controller/model/api_session_certificate_model.go @@ -86,7 +86,7 @@ func (entity *ApiSessionCertificate) fillFrom(env Env, tx *bbolt.Tx, boltApiSess entity.PEM = boltApiSessionCertificate.PEM entity.ApiSessionId = boltApiSessionCertificate.ApiSessionId - boltApiSession, err := env.GetStores().ApiSession.LoadOneById(tx, boltApiSessionCertificate.ApiSessionId) + boltApiSession, err := env.GetStores().ApiSession.LoadById(tx, boltApiSessionCertificate.ApiSessionId) if err != nil { return err } diff --git a/controller/model/api_session_model.go b/controller/model/api_session_model.go index 039c8a463..329dfa6e0 100644 --- a/controller/model/api_session_model.go +++ b/controller/model/api_session_model.go @@ -82,7 +82,7 @@ func (entity *ApiSession) fillFrom(env Env, tx *bbolt.Tx, boltApiSession *db.Api entity.LastActivityAt = boltApiSession.LastActivityAt entity.AuthenticatorId = boltApiSession.AuthenticatorId - boltIdentity, err := env.GetStores().Identity.LoadOneById(tx, boltApiSession.IdentityId) + boltIdentity, err := env.GetStores().Identity.LoadById(tx, boltApiSession.IdentityId) if err != nil { return err } diff --git a/controller/model/authenticator_manager.go b/controller/model/authenticator_manager.go index 55cc6030b..5cefa3d66 100644 --- a/controller/model/authenticator_manager.go +++ b/controller/model/authenticator_manager.go @@ -87,7 +87,7 @@ func (self *AuthenticatorManager) ReadFingerprints(authenticatorId string) ([]st err := self.env.GetDbProvider().GetDb().View(func(tx *bbolt.Tx) error { var err error - authenticator, err = self.authStore.LoadOneById(tx, authenticatorId) + authenticator, err = self.authStore.LoadById(tx, authenticatorId) return err }) @@ -677,7 +677,7 @@ func getCaId(env Env, auth *AuthenticatorCert) string { caId := "" err := env.GetDbProvider().GetDb().View(func(tx *bbolt.Tx) error { for cursor := env.GetStores().Ca.IterateIds(tx, ast.BoolNodeTrue); cursor.IsValid(); cursor.Next() { - ca, err := env.GetStores().Ca.LoadOneById(tx, string(cursor.Current())) + ca, err := env.GetStores().Ca.LoadById(tx, string(cursor.Current())) if err != nil { continue } diff --git a/controller/model/authenticator_mod_ext_jwt.go b/controller/model/authenticator_mod_ext_jwt.go index 591ccb795..d969c242d 100644 --- a/controller/model/authenticator_mod_ext_jwt.go +++ b/controller/model/authenticator_mod_ext_jwt.go @@ -566,7 +566,7 @@ func (a *AuthModuleExtJwt) loadExistingSigners() { } for _, id := range ids { - signer, err := a.env.GetStores().ExternalJwtSigner.LoadOneById(tx, id) + signer, err := a.env.GetStores().ExternalJwtSigner.LoadById(tx, id) if err != nil { return err } diff --git a/controller/model/create_terminator_cmd.go b/controller/model/create_terminator_cmd.go index 5cb1955d1..cb6415def 100644 --- a/controller/model/create_terminator_cmd.go +++ b/controller/model/create_terminator_cmd.go @@ -93,7 +93,7 @@ func (self *CreateEdgeTerminatorCmd) getTerminatorSession(tx *bbolt.Tx, terminat } if session.ApiSession == nil { - apiSession, err := self.Env.GetStores().ApiSession.LoadOneById(tx, session.ApiSessionId) + apiSession, err := self.Env.GetStores().ApiSession.LoadById(tx, session.ApiSessionId) if err != nil { return nil, err } diff --git a/controller/model/edge_service_manager.go b/controller/model/edge_service_manager.go index 5918b45c3..e42e082f7 100644 --- a/controller/model/edge_service_manager.go +++ b/controller/model/edge_service_manager.go @@ -287,7 +287,7 @@ func (self *EdgeServiceManager) mergeConfigs(tx *bbolt.Tx, configTypes map[strin if len(configTypes) > 0 && len(service.Configs) > 0 { configStore := self.env.GetStores().Config for _, configId := range service.Configs { - config, _ := configStore.LoadOneById(tx, configId) + config, _ := configStore.LoadById(tx, configId) if config != nil { _, wantsConfig := configTypes[config.Type] if wantsAll || wantsConfig { diff --git a/controller/model/edge_service_model.go b/controller/model/edge_service_model.go index 75a6d6daa..b3e411689 100644 --- a/controller/model/edge_service_model.go +++ b/controller/model/edge_service_model.go @@ -63,14 +63,14 @@ func (entity *Service) validateConfigs(tx *bbolt.Tx, env Env) error { typeMap := map[string]*db.Config{} configStore := env.GetStores().Config for _, id := range entity.Configs { - config, _ := configStore.LoadOneById(tx, id) + config, _ := configStore.LoadById(tx, id) if config == nil { return boltz.NewNotFoundError(db.EntityTypeConfigs, "id", id) } conflictConfig, found := typeMap[config.Type] if found { configTypeName := "" - if configType, _ := env.GetStores().ConfigType.LoadOneById(tx, config.Type); configType != nil { + if configType, _ := env.GetStores().ConfigType.LoadById(tx, config.Type); configType != nil { configTypeName = configType.Name } msg := fmt.Sprintf("duplicate configs named %v and %v found for config type %v. Only one config of a given typed is allowed per service ", diff --git a/controller/model/mfa_model.go b/controller/model/mfa_model.go index 93d8cd372..6b0d7685a 100644 --- a/controller/model/mfa_model.go +++ b/controller/model/mfa_model.go @@ -68,7 +68,7 @@ func (entity *Mfa) fillFrom(env Env, tx *bbolt.Tx, boltMfa *db.Mfa) error { entity.IdentityId = boltMfa.IdentityId entity.RecoveryCodes = boltMfa.RecoveryCodes entity.Secret = boltMfa.Secret - boltIdentity, err := env.GetStores().Identity.LoadOneById(tx, boltMfa.IdentityId) + boltIdentity, err := env.GetStores().Identity.LoadById(tx, boltMfa.IdentityId) if err != nil { return err } diff --git a/controller/model/policy_advisor.go b/controller/model/policy_advisor.go index a41a3e6cc..456790639 100644 --- a/controller/model/policy_advisor.go +++ b/controller/model/policy_advisor.go @@ -82,7 +82,7 @@ func (advisor *PolicyAdvisor) getServicePermissions(identityId, serviceId string servicePolicyStore := advisor.env.GetStores().ServicePolicy servicePolicyIterator := func(tx *bbolt.Tx, servicePolicyId string) error { - servicePolicy, err := servicePolicyStore.LoadOneById(tx, servicePolicyId) + servicePolicy, err := servicePolicyStore.LoadById(tx, servicePolicyId) if err != nil { return err } diff --git a/controller/model/posture_response_manager.go b/controller/model/posture_response_manager.go index d6353948b..ddfcf8c02 100644 --- a/controller/model/posture_response_manager.go +++ b/controller/model/posture_response_manager.go @@ -289,7 +289,7 @@ func (self *PostureResponseManager) GetEndpointStateChangeAffectedServices(timeS cursor := self.env.GetStores().PostureCheck.IterateIds(tx, query) for cursor.IsValid() { - if check, err := self.env.GetStores().PostureCheck.LoadOneById(tx, string(cursor.Current())); err == nil { + if check, err := self.env.GetStores().PostureCheck.LoadById(tx, string(cursor.Current())); err == nil { if mfaCheck, ok := check.SubType.(*db.PostureCheckMfa); ok { if shouldPostureCheckTimeoutBeAltered(mfaCheck, timeSinceLastMfa, gracePeriod, onWake, onUnlock) { affectedChecks[check.Id] = mfaCheck.TimeoutSeconds @@ -321,7 +321,7 @@ func (self *PostureResponseManager) GetEndpointStateChangeAffectedServices(timeS for serviceCursor.IsValid() { if _, ok := services[string(serviceCursor.Current())]; !ok { - service, err := self.env.GetStores().EdgeService.LoadOneById(tx, string(serviceCursor.Current())) + service, err := self.env.GetStores().EdgeService.LoadById(tx, string(serviceCursor.Current())) if err == nil { modelService := &Service{} if err := modelService.fillFrom(self.env, tx, service); err == nil { diff --git a/controller/model/posture_response_model.go b/controller/model/posture_response_model.go index 4897d0382..97bc533d2 100644 --- a/controller/model/posture_response_model.go +++ b/controller/model/posture_response_model.go @@ -122,7 +122,7 @@ func (pc *PostureCache) evaluate() { } for cursor.IsValid() && len(sessions) < maxScanPerTx { - if session, _ := pc.env.GetStores().Session.LoadOneById(tx, string(cursor.Current())); session != nil { + if session, _ := pc.env.GetStores().Session.LoadById(tx, string(cursor.Current())); session != nil { sessions = append(sessions, session) } lastId = cursor.Current() diff --git a/controller/model/session_model.go b/controller/model/session_model.go index 64518dc91..b32d86931 100644 --- a/controller/model/session_model.go +++ b/controller/model/session_model.go @@ -35,7 +35,7 @@ type Session struct { } func (entity *Session) toBoltEntityForCreate(tx *bbolt.Tx, env Env) (*db.Session, error) { - apiSession, err := env.GetStores().ApiSession.LoadOneById(tx, entity.ApiSessionId) + apiSession, err := env.GetStores().ApiSession.LoadById(tx, entity.ApiSessionId) if err != nil { return nil, err } diff --git a/controller/sync_strats/sync_instant.go b/controller/sync_strats/sync_instant.go index ca27cef83..e8a426a76 100644 --- a/controller/sync_strats/sync_instant.go +++ b/controller/sync_strats/sync_instant.go @@ -619,7 +619,7 @@ func (strategy *InstantStrategy) synchronize(rtx *RouterSender) { for cursor := strategy.ae.GetStores().ApiSession.IterateIds(tx, ast.BoolNodeTrue); cursor.IsValid(); cursor.Next() { current := cursor.Current() - apiSession, err := strategy.ae.GetStores().ApiSession.LoadOneById(tx, string(current)) + apiSession, err := strategy.ae.GetStores().ApiSession.LoadById(tx, string(current)) if err != nil { logger.WithError(err).WithField("apiSessionId", string(current)).Errorf("error querying api session [%s]: %v", string(current), err) @@ -782,7 +782,7 @@ func (strategy *InstantStrategy) BuildServicePolicies(tx *bbolt.Tx) error { currentBytes := cursor.Current() currentId := string(currentBytes) - storeModel, err := strategy.ae.GetStores().ServicePolicy.LoadOneById(tx, currentId) + storeModel, err := strategy.ae.GetStores().ServicePolicy.LoadById(tx, currentId) if err != nil { return err @@ -831,7 +831,7 @@ func (strategy *InstantStrategy) BuildPublicKeys(tx *bbolt.Tx) error { currentBytes := cursor.Current() currentId := string(currentBytes) - ca, err := strategy.ae.GetStores().Ca.LoadOneById(tx, currentId) + ca, err := strategy.ae.GetStores().Ca.LoadById(tx, currentId) if err != nil { return err @@ -953,7 +953,7 @@ func (strategy *InstantStrategy) BuildPostureChecks(tx *bbolt.Tx) error { } func newIdentityById(tx *bbolt.Tx, ae *env.AppEnv, id string) (*edge_ctrl_pb.DataState_Identity, error) { - identityModel, err := ae.GetStores().Identity.LoadOneById(tx, id) + identityModel, err := ae.GetStores().Identity.LoadById(tx, id) if err != nil { return nil, err @@ -985,7 +985,7 @@ func newServicePolicy(tx *bbolt.Tx, env *env.AppEnv, storeModel *db.ServicePolic } func newServiceById(tx *bbolt.Tx, ae *env.AppEnv, id string) (*edge_ctrl_pb.DataState_Service, error) { - storeModel, err := ae.GetStores().EdgeService.LoadOneById(tx, id) + storeModel, err := ae.GetStores().EdgeService.LoadById(tx, id) if err != nil { return nil, err @@ -1011,7 +1011,7 @@ func newPublicKey(data []byte, format edge_ctrl_pb.DataState_PublicKey_Format, u } func newPostureCheckById(tx *bbolt.Tx, ae *env.AppEnv, id string) (*edge_ctrl_pb.DataState_PostureCheck, error) { - postureModel, err := ae.GetStores().PostureCheck.LoadOneById(tx, id) + postureModel, err := ae.GetStores().PostureCheck.LoadById(tx, id) if err != nil { return nil, err diff --git a/ziti/cmd/database/add_debug_admin.go b/ziti/cmd/database/add_debug_admin.go index 020946241..d69fdc587 100644 --- a/ziti/cmd/database/add_debug_admin.go +++ b/ziti/cmd/database/add_debug_admin.go @@ -91,7 +91,7 @@ func (action *addDebugAdminAction) run(dbFile, username, password string) { ctx := change.New().SetChangeAuthorType("cli.debug-db").NewMutateContext() err = dbProvider.GetDb().Update(ctx, func(ctx boltz.MutateContext) error { tx := ctx.Tx() - identity, _ := stores.Identity.LoadOneById(tx, id) + identity, _ := stores.Identity.LoadById(tx, id) if identity != nil { if err = stores.Identity.DeleteById(ctx, id); err != nil { return err diff --git a/zititest/zitilab/models/db_builder.go b/zititest/zitilab/models/db_builder.go index f6938e6e9..e02efab21 100644 --- a/zititest/zitilab/models/db_builder.go +++ b/zititest/zitilab/models/db_builder.go @@ -70,7 +70,7 @@ func (self *ZitiDbBuilder) CreateEdgeRouterHosts(tx *bbolt.Tx, m *model.Model) e } for _, id := range ids { - er, err := self.stores.EdgeRouter.LoadOneById(tx, id) + er, err := self.stores.EdgeRouter.LoadById(tx, id) if err != nil { return err } From 8ec6aa208f3026c62cc5fb4ec4c8ef98d7d9f5a8 Mon Sep 17 00:00:00 2001 From: Kenneth Bingham Date: Thu, 21 Mar 2024 10:51:11 -0400 Subject: [PATCH 26/29] reduce Docker image sizes --- dist/docker-images/ziti-cli/Dockerfile | 3 ++- dist/docker-images/ziti-tunnel/Dockerfile | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/dist/docker-images/ziti-cli/Dockerfile b/dist/docker-images/ziti-cli/Dockerfile index 80da2adf2..c6fbbb3f7 100644 --- a/dist/docker-images/ziti-cli/Dockerfile +++ b/dist/docker-images/ziti-cli/Dockerfile @@ -33,7 +33,8 @@ USER root ### install packages RUN INSTALL_PKGS="python3.11 python3.11-pip tar bash-completion vim-minimal less shadow-utils jq findutils" && \ microdnf -y update --setopt=install_weak_deps=0 --setopt=tsflags=nodocs && \ - microdnf -y install --setopt=install_weak_deps=0 --setopt=tsflags=nodocs ${INSTALL_PKGS} + microdnf -y install --setopt=install_weak_deps=0 --setopt=tsflags=nodocs ${INSTALL_PKGS} && \ + microdnf clean all ### install OpenShift CLI (oc) # FIXME: This repo requires terms acceptance and is only available on registry.redhat.io. diff --git a/dist/docker-images/ziti-tunnel/Dockerfile b/dist/docker-images/ziti-tunnel/Dockerfile index eb57033c2..2b0682c61 100644 --- a/dist/docker-images/ziti-tunnel/Dockerfile +++ b/dist/docker-images/ziti-tunnel/Dockerfile @@ -18,7 +18,9 @@ LABEL name="openziti/ziti-tunnel" \ USER root RUN INSTALL_PKGS="util-linux iptables" && \ microdnf -y update --setopt=install_weak_deps=0 --setopt=tsflags=nodocs && \ - microdnf -y install --setopt=install_weak_deps=0 --setopt=tsflags=nodocs ${INSTALL_PKGS} + microdnf -y install --setopt=install_weak_deps=0 --setopt=tsflags=nodocs ${INSTALL_PKGS} && \ + microdnf clean all + WORKDIR /netfoundry COPY ./entrypoint.sh / RUN chmod +x /entrypoint.sh From 032eb60f54d1ad836b7c432be14cb22fa5cd7e9f Mon Sep 17 00:00:00 2001 From: Kenneth Bingham Date: Thu, 21 Mar 2024 18:40:25 -0400 Subject: [PATCH 27/29] add create config environment --no-shell option to suppress shell variable declarations for generic env assignments usable with Docker Compose and systemd; fixed #1858 --- ziti/cmd/create/config_templates/environment.yml | 6 +++++- ziti/cmd/create/create_config_environment.go | 16 ++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/ziti/cmd/create/config_templates/environment.yml b/ziti/cmd/create/config_templates/environment.yml index 2b402a7e5..368225b95 100644 --- a/ziti/cmd/create/config_templates/environment.yml +++ b/ziti/cmd/create/config_templates/environment.yml @@ -2,5 +2,9 @@ {{ $varDeclare := .OSVarDeclare }} {{- range .EnvVars}} {{ $commentPrefix }} {{ .Description }} +{{- if $varDeclare }} {{ $varDeclare }} {{ .Name }}={{ .Value }} -{{- end }} \ No newline at end of file +{{- else }} +{{ .Name }}={{ .Value }} +{{- end }} +{{- end }} diff --git a/ziti/cmd/create/create_config_environment.go b/ziti/cmd/create/create_config_environment.go index fb5066152..a378c759b 100644 --- a/ziti/cmd/create/create_config_environment.go +++ b/ziti/cmd/create/create_config_environment.go @@ -69,11 +69,18 @@ var environmentOptions *CreateConfigEnvironmentOptions type CreateConfigEnvironmentOptions struct { CreateConfigOptions EnvVariableTemplateData + + DisableOSVarDeclare bool +} + +func (options *CreateConfigEnvironmentOptions) addFlags(cmd *cobra.Command) { + cmd.Flags().BoolVar(&options.DisableOSVarDeclare, "no-shell", false, "Disable printing assignments prefixed with 'SET' (Windows) or 'export' (Unix)") } // NewCmdCreateConfigEnvironment creates a command object for the "environment" command func NewCmdCreateConfigEnvironment() *cobra.Command { environmentOptions = &CreateConfigEnvironmentOptions{} + data := &ConfigTemplateValues{} cmd := &cobra.Command{ @@ -138,10 +145,14 @@ func NewCmdCreateConfigEnvironment() *cobra.Command { // Figure out the correct comment prefix and variable declaration command if runtime.GOOS == "windows" { environmentOptions.OSCommentPrefix = "rem" - environmentOptions.OSVarDeclare = "SET" + if ! environmentOptions.DisableOSVarDeclare { + environmentOptions.OSVarDeclare = "SET" + } } else { environmentOptions.OSCommentPrefix = "#" - environmentOptions.OSVarDeclare = "export" + if ! environmentOptions.DisableOSVarDeclare { + environmentOptions.OSVarDeclare = "export" + } } if environmentOptions.Verbose { logrus.SetLevel(logrus.DebugLevel) @@ -212,6 +223,7 @@ func NewCmdCreateConfigEnvironment() *cobra.Command { cmd.Long = sb.String() + environmentOptions.addFlags(cmd) environmentOptions.addCreateFlags(cmd) return cmd From b04f6995acfe2ac6f4962ad2d1b7d769b2a57c8a Mon Sep 17 00:00:00 2001 From: Paul Lorenz Date: Mon, 25 Mar 2024 11:51:18 -0400 Subject: [PATCH 28/29] Bump deps and changelog --- .github/dependabot.yml | 42 ++++++++++++++++++++++++-------- CHANGELOG.md | 28 ++++++++++++++------- go.mod | 24 +++++++++--------- go.sum | 55 +++++++++++++++++++----------------------- zititest/go.mod | 24 +++++++++--------- zititest/go.sum | 55 +++++++++++++++++++----------------------- 6 files changed, 125 insertions(+), 103 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index e62b5d7b2..f7537a397 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,12 +1,34 @@ version: 2 updates: - - package-ecosystem: gomod - directory: "/" - schedule: - interval: daily - open-pull-requests-limit: 10 - - package-ecosystem: github-actions - directory: "/" - schedule: - interval: weekly - open-pull-requests-limit: 10 +- package-ecosystem: gomod + directory: "/" + schedule: + interval: daily + open-pull-requests-limit: 10 + groups: + openziti: + applies-to: version-updates + update-types: + - "minor" + - "patch" + include-patterns: + - "openziti" + + non-major: + applies-to: version-updates + update-types: + - "minor" + - "patch" + exclude-patterns: + - "rabbitmq" + - "blackfriday" + - "zitadel" + +- package-ecosystem: github-actions + directory: "/" + schedule: + interval: weekly + open-pull-requests-limit: 10 + groups: + all: + applies-to: version-updates diff --git a/CHANGELOG.md b/CHANGELOG.md index e2a431520..69c612182 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,22 +2,32 @@ ## What's New +* Bug fixes and performance enhancements +* Version number is bumped as a large chunk of HA was merged up. The next version bump is likely to bring HA to alpha status. + ## Component Updates and Bug Fixes -* github.com/openziti/channel/v2: [v2.0.119 -> v2.0.121](https://github.com/openziti/channel/compare/v2.0.119...v2.0.121) -* github.com/openziti/edge-api: [v0.26.12 -> v0.26.13](https://github.com/openziti/edge-api/compare/v0.26.12...v0.26.13) -* github.com/openziti/foundation/v2: [v2.0.37 -> v2.0.39](https://github.com/openziti/foundation/compare/v2.0.37...v2.0.39) -* github.com/openziti/identity: [v1.0.70 -> v1.0.72](https://github.com/openziti/identity/compare/v1.0.70...v1.0.72) -* github.com/openziti/metrics: [v1.2.45 -> v1.2.47](https://github.com/openziti/metrics/compare/v1.2.45...v1.2.47) -* github.com/openziti/runzmd: [v1.0.38 -> v1.0.40](https://github.com/openziti/runzmd/compare/v1.0.38...v1.0.40) -* github.com/openziti/sdk-golang: [v0.22.28 -> v0.23.10](https://github.com/openziti/sdk-golang/compare/v0.22.28...v0.23.10) +* github.com/openziti/channel/v2: [v2.0.119 -> v2.0.122](https://github.com/openziti/channel/compare/v2.0.119...v2.0.122) +* github.com/openziti/edge-api: [v0.26.12 -> v0.26.14](https://github.com/openziti/edge-api/compare/v0.26.12...v0.26.14) +* github.com/openziti/foundation/v2: [v2.0.37 -> v2.0.40](https://github.com/openziti/foundation/compare/v2.0.37...v2.0.40) +* github.com/openziti/identity: [v1.0.70 -> v1.0.73](https://github.com/openziti/identity/compare/v1.0.70...v1.0.73) +* github.com/openziti/metrics: [v1.2.45 -> v1.2.48](https://github.com/openziti/metrics/compare/v1.2.45...v1.2.48) +* github.com/openziti/runzmd: [v1.0.38 -> v1.0.41](https://github.com/openziti/runzmd/compare/v1.0.38...v1.0.41) +* github.com/openziti/sdk-golang: [v0.22.28 -> v0.23.14](https://github.com/openziti/sdk-golang/compare/v0.22.28...v0.23.14) + * [Issue #524](https://github.com/openziti/sdk-golang/issues/524) - Add circuit id to edge.Conn, so sdk connections can be correlated with network traffic * [Issue #515](https://github.com/openziti/sdk-golang/issues/515) - Service hosting improvements * [Issue #501](https://github.com/openziti/sdk-golang/issues/501) - Improve hosting session management * github.com/openziti/secretstream: [v0.1.16 -> v0.1.17](https://github.com/openziti/secretstream/compare/v0.1.16...v0.1.17) -* github.com/openziti/storage: [v0.2.30 -> v0.2.32](https://github.com/openziti/storage/compare/v0.2.30...v0.2.32) -* github.com/openziti/transport/v2: [v2.0.122 -> v2.0.124](https://github.com/openziti/transport/compare/v2.0.122...v2.0.124) +* github.com/openziti/storage: [v0.2.30 -> v0.2.33](https://github.com/openziti/storage/compare/v0.2.30...v0.2.33) +* github.com/openziti/transport/v2: [v2.0.122 -> v2.0.125](https://github.com/openziti/transport/compare/v2.0.122...v2.0.125) * github.com/openziti/ziti: [v0.33.1 -> v0.34.0](https://github.com/openziti/ziti/compare/v0.33.1...v0.34.0) + * [Issue #1858](https://github.com/openziti/ziti/issues/1858) - add option to create a generic env file instead of a BASH script + * [Issue #1428](https://github.com/openziti/ziti/issues/1428) - Investigate policy integrity performance + * [Issue #1854](https://github.com/openziti/ziti/issues/1854) - Controller can try to send unroute to router which has since disconnected, causing panic + * [Issue #1576](https://github.com/openziti/ziti/issues/1576) - Don't scan for posture checks if there are no posture checks + * [Issue #1849](https://github.com/openziti/ziti/issues/1849) - Session Sync shouldn't be able to block the control channel + * [Issue #1846](https://github.com/openziti/ziti/issues/1846) - Looking up api session certs for api sessions is inefficient # Release 0.33.1 diff --git a/go.mod b/go.mod index 826cf69dd..3c6d55450 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/fatih/color v1.16.0 github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa github.com/gaissmai/extnetip v0.4.0 - github.com/go-acme/lego/v4 v4.15.0 + github.com/go-acme/lego/v4 v4.16.1 github.com/go-openapi/errors v0.22.0 github.com/go-openapi/loads v0.22.0 github.com/go-openapi/runtime v0.28.0 @@ -25,7 +25,7 @@ require ( github.com/go-openapi/strfmt v0.23.0 github.com/go-openapi/swag v0.23.0 github.com/go-openapi/validate v0.24.0 - github.com/go-resty/resty/v2 v2.11.0 + github.com/go-resty/resty/v2 v2.12.0 github.com/golang-jwt/jwt/v5 v5.2.1 github.com/google/go-cmp v0.6.0 github.com/google/gopacket v1.1.19 @@ -37,7 +37,7 @@ require ( github.com/hashicorp/golang-lru/v2 v2.0.7 github.com/hashicorp/raft v1.6.1 github.com/hashicorp/raft-boltdb v0.0.0-20220329195025-15018e9b97e0 - github.com/jedib0t/go-pretty/v6 v6.5.4 + github.com/jedib0t/go-pretty/v6 v6.5.6 github.com/jessevdk/go-flags v1.5.0 github.com/jinzhu/copier v0.4.0 github.com/kataras/go-events v0.0.3 @@ -48,17 +48,17 @@ require ( github.com/mitchellh/mapstructure v1.5.0 github.com/natefinch/lumberjack v2.0.0+incompatible github.com/openziti/agent v1.0.16 - github.com/openziti/channel/v2 v2.0.121 + github.com/openziti/channel/v2 v2.0.122 github.com/openziti/edge-api v0.26.13 - github.com/openziti/foundation/v2 v2.0.39 - github.com/openziti/identity v1.0.72 + github.com/openziti/foundation/v2 v2.0.40 + github.com/openziti/identity v1.0.73 github.com/openziti/jwks v1.0.3 - github.com/openziti/metrics v1.2.47 - github.com/openziti/runzmd v1.0.40 - github.com/openziti/sdk-golang v0.23.10 + github.com/openziti/metrics v1.2.48 + github.com/openziti/runzmd v1.0.41 + github.com/openziti/sdk-golang v0.23.14 github.com/openziti/secretstream v0.1.17 - github.com/openziti/storage v0.2.32 - github.com/openziti/transport/v2 v2.0.124 + github.com/openziti/storage v0.2.33 + github.com/openziti/transport/v2 v2.0.125 github.com/openziti/x509-claims v1.0.3 github.com/openziti/xweb/v2 v2.1.0 github.com/openziti/ziti-db-explorer v1.1.3 @@ -112,7 +112,7 @@ require ( github.com/eliukblau/pixterm/pkg/ansimage v0.0.0-20191210081756-9fb6cf8c2f75 // indirect github.com/felixge/httpsnoop v1.0.3 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-jose/go-jose/v3 v3.0.3 // indirect + github.com/go-jose/go-jose/v4 v4.0.1 // indirect github.com/go-logr/logr v1.4.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect diff --git a/go.sum b/go.sum index a24dd8a0c..917a706e5 100644 --- a/go.sum +++ b/go.sum @@ -197,15 +197,15 @@ github.com/gaissmai/extnetip v0.4.0/go.mod h1:M3NWlyFKaVosQXWXKKeIPK+5VM4U85Dahd github.com/getkin/kin-openapi v0.13.0/go.mod h1:WGRs2ZMM1Q8LR1QBEwUxC6RJEfaBcD0s+pcEVXFuAjw= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-acme/lego/v4 v4.15.0 h1:A7MHEU3b+TDFqhC/HmzMJnzPbyeaYvMZQBbqgvbThhU= -github.com/go-acme/lego/v4 v4.15.0/go.mod h1:eeGhjW4zWT7Ccqa3sY7ayEqFLCAICx+mXgkMHKIkLxg= +github.com/go-acme/lego/v4 v4.16.1 h1:JxZ93s4KG0jL27rZ30UsIgxap6VGzKuREsSkkyzeoCQ= +github.com/go-acme/lego/v4 v4.16.1/go.mod h1:AVvwdPned/IWpD/ihHhMsKnveF7HHYAz/CmtXi7OZoE= github.com/go-chi/chi v4.0.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-jose/go-jose/v3 v3.0.3 h1:fFKWeig/irsp7XD2zBxvnmA/XaRWp5V3CBsZXJF7G7k= -github.com/go-jose/go-jose/v3 v3.0.3/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= +github.com/go-jose/go-jose/v4 v4.0.1 h1:QVEPDE3OluqXBQZDcnNvQrInro2h0e4eqNbnZSWqS6U= +github.com/go-jose/go-jose/v4 v4.0.1/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= @@ -238,8 +238,8 @@ github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+Gr github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58= github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ= -github.com/go-resty/resty/v2 v2.11.0 h1:i7jMfNOJYMp69lq7qozJP+bjgzfAzeOhuGlyDrqxT/8= -github.com/go-resty/resty/v2 v2.11.0/go.mod h1:iiP/OpA0CkcL3IGt1O0+/SIItFUbkkyw5BGXiVdTu+A= +github.com/go-resty/resty/v2 v2.12.0 h1:rsVL8P90LFvkUYq/V5BTVe203WfRIU4gvcf+yfzJzGA= +github.com/go-resty/resty/v2 v2.12.0/go.mod h1:o0yGPrkS3lOe1+eFajk6kBW8ScXzwU3hD69/gt2yB/0= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -403,8 +403,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb-client-go/v2 v2.2.2/go.mod h1:fa/d1lAdUHxuc1jedx30ZfNG573oQTQmUni3N6pcW+0= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/jedib0t/go-pretty/v6 v6.5.4 h1:gOGo0613MoqUcf0xCj+h/V3sHDaZasfv152G6/5l91s= -github.com/jedib0t/go-pretty/v6 v6.5.4/go.mod h1:5LQIxa52oJ/DlDSLv0HEkWOFMDGoWkJb9ss5KqPpJBg= +github.com/jedib0t/go-pretty/v6 v6.5.6 h1:nKXVLqPfAwY7sWcYXdNZZZ2fjqDpAtj9UeWupgfUxSg= +github.com/jedib0t/go-pretty/v6 v6.5.6/go.mod h1:5LQIxa52oJ/DlDSLv0HEkWOFMDGoWkJb9ss5KqPpJBg= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jeremija/gosubmit v0.2.7 h1:At0OhGCFGPXyjPYAsCchoBUhE099pcBXmsb4iZqROIc= github.com/jeremija/gosubmit v0.2.7/go.mod h1:Ui+HS073lCFREXBbdfrJzMB57OI/bdxTiLtrDHHhFPI= @@ -566,30 +566,30 @@ github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYr github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/openziti/agent v1.0.16 h1:9Saji+8hFE1NpzP2XzDhsVJbCrDlhixoLHfOpFt5Z+U= github.com/openziti/agent v1.0.16/go.mod h1:zfm53+PVWoGFzjGGgQdKby5749G6VRYHe+eQJmoVKy4= -github.com/openziti/channel/v2 v2.0.121 h1:dCPNbn0VbGIOrzXHcnjp5p0XzZCbpHKRmMhi9LRex0E= -github.com/openziti/channel/v2 v2.0.121/go.mod h1:f/DLqWVAFF5pDIpse8BRm4ZwhpAFjx0gUGjPEqlPSZE= +github.com/openziti/channel/v2 v2.0.122 h1:MPALuLUuTsW2QJzaoRkrP/wGqhIeWtSsrnxt2Ept5SU= +github.com/openziti/channel/v2 v2.0.122/go.mod h1:n4r/pWTFYJy98hEtf4ATYVHU70OePjoM8JJzrIvXvZg= github.com/openziti/dilithium v0.3.3 h1:PLgQ6PMNLSTzCFbX/h98cmudgz/cU6TmjdSv5NAPD8k= github.com/openziti/dilithium v0.3.3/go.mod h1:vsCjI2AU/hon9e+dLhUFbCNGesJDj2ASgkySOcpmvjo= github.com/openziti/edge-api v0.26.13 h1:lWAHu04nk7a0AEnJBjmwijUIEE+NvNAiOcdg11dxbIY= github.com/openziti/edge-api v0.26.13/go.mod h1:aTRqB9J/6ISbw9+YWjzD0tvWAXY98m8yWcbiGNqAQTU= -github.com/openziti/foundation/v2 v2.0.39 h1:psv1cTgBErOME4K5TmxolUzz8VabJVhGygsAz6uXAQM= -github.com/openziti/foundation/v2 v2.0.39/go.mod h1:38RikdtjvzDUALm3jT3PSOrU0bHCleRty6bHGdfFyUI= -github.com/openziti/identity v1.0.72 h1:Y14nUtgDiUBWZ6WBo6S1rw5qb57QNnZGhsFnMPqfJB8= -github.com/openziti/identity v1.0.72/go.mod h1:sh1STe6K3EM3K0atBVDLq5jpUxAAFCAQZmIkD0MYIKY= +github.com/openziti/foundation/v2 v2.0.40 h1:8oXL77egZjnQuKuxPTHiBOh+X/I2mSJefIbnLSv8rFI= +github.com/openziti/foundation/v2 v2.0.40/go.mod h1:38RikdtjvzDUALm3jT3PSOrU0bHCleRty6bHGdfFyUI= +github.com/openziti/identity v1.0.73 h1:F1iF/rDQYfDIv4ktqBYwK/0C5Ra/7y92Z5Umrw4c4fk= +github.com/openziti/identity v1.0.73/go.mod h1:SKcvyjTlSIpxJuhYLjayJgB800EJ/nO4Y/Lhh77NE9A= github.com/openziti/jwks v1.0.3 h1:hf8wkb+Cg4nH/HM0KROFd7u+C3DkRVcFZJ7tDV+4icc= github.com/openziti/jwks v1.0.3/go.mod h1:t4xxq8vlXGsPn29kiQVnZBBDDnEoOFqtJoHibkJunQQ= -github.com/openziti/metrics v1.2.47 h1:hIp1xnqLxNc7O0yTHIp65REhYBXj7QWeOiayGDzjRrw= -github.com/openziti/metrics v1.2.47/go.mod h1:pHj/z3HCls4/+dLoQKTURNTnHmwUbjZFZOGzj2X6HeI= -github.com/openziti/runzmd v1.0.40 h1:QQuYr7QHci3PTLZJGjaOpH3uGxRCjGJ3DF1KgxXIzq4= -github.com/openziti/runzmd v1.0.40/go.mod h1:WhNu56fgNpDTMKuiLgsqYJLVso0ByDPADsAQZj9m8Lo= -github.com/openziti/sdk-golang v0.23.10 h1:ygpOt99Rd5ESoH1ExYqBHhZp47s5/DYxyfgTO6uYr7Q= -github.com/openziti/sdk-golang v0.23.10/go.mod h1:07G4gYyZzRt9fb3uxEhwdsgJwDrqEkjuvVnnRlsrfEc= +github.com/openziti/metrics v1.2.48 h1:bDUcWSTWM4vXh4YU8z953Q/vtlUjtH+pSaQviKzB578= +github.com/openziti/metrics v1.2.48/go.mod h1:rLFoXigAFb5clCDqe/RlvFFjlaTr9Li7iEn3OxInmb0= +github.com/openziti/runzmd v1.0.41 h1:Iuwe91Lzq63ux2R6+VIWEvcEKhpKkPb1QVNwrJHOuDA= +github.com/openziti/runzmd v1.0.41/go.mod h1:T79oGLLJNnAhHzcfnlrOR39S2XGkzwYZLZh62xee0wk= +github.com/openziti/sdk-golang v0.23.14 h1:usGFwrc7jcGkvas5TVLWQgdWs/FBUZrORb6jV+KM2eY= +github.com/openziti/sdk-golang v0.23.14/go.mod h1:mM7C6QMcEZwVhBLwmrq8PtBMyBbXXoKr186CDpTx5rI= github.com/openziti/secretstream v0.1.17 h1:bcaPGGpUl0+3GzfQkshKh5slUE7QDXxFq3vyDQgHkCA= github.com/openziti/secretstream v0.1.17/go.mod h1:gosi8ohW+dAHhz1h/MjZEcEVWO0jisWqWjEjmx7oAEs= -github.com/openziti/storage v0.2.32 h1:LmW6AhSZ2fu25afXIOAwJOikUOxiMIMRPSLPKWD5++Y= -github.com/openziti/storage v0.2.32/go.mod h1:ImCFExNWGVW8Pz0UcVw9o38+jcskXIQ/6prrJtDyhE8= -github.com/openziti/transport/v2 v2.0.124 h1:84bq7vyqzGJXPek9qyc/7mtVEhp6KTQMK2msq3hwGkY= -github.com/openziti/transport/v2 v2.0.124/go.mod h1:eQ3011tfSlmBI3cIkcJOf9YP/afj+Jd2EQM6MCHoJCQ= +github.com/openziti/storage v0.2.33 h1:15WKxJ0J1GCNOMmOkoosjoxKN2Hrm4p3g8p9WAiMS9Y= +github.com/openziti/storage v0.2.33/go.mod h1:AbE5KkTVlXVFHRqpc7Ug3eFpNOc1HFBFwNIYn8Rtp+s= +github.com/openziti/transport/v2 v2.0.125 h1:6kDfabGFIE2+UPyvJVtfI43CNKcMwNOrCRX602CbDU4= +github.com/openziti/transport/v2 v2.0.125/go.mod h1:meVOsDPZSO/hNWSA+NGK5sAoeSgWoqfJgKUZlM3iX1E= github.com/openziti/x509-claims v1.0.3 h1:HNdQ8Nf1agB3lBs1gahcO6zfkeS4S5xoQ2/PkY4HRX0= github.com/openziti/x509-claims v1.0.3/go.mod h1:Z0WIpBm6c4ecrpRKrou6Gk2wrLWxJO/+tuUwKh8VewE= github.com/openziti/xweb/v2 v2.1.0 h1:Xhh3C2pZkq/Prr65V+SfFSibLDYteoc4f62KQCcTZF4= @@ -861,7 +861,6 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= @@ -962,7 +961,7 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1075,7 +1074,6 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= @@ -1084,7 +1082,6 @@ golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuX golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= @@ -1100,14 +1097,12 @@ golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/zititest/go.mod b/zititest/go.mod index 02656735b..ec19d3fe1 100644 --- a/zititest/go.mod +++ b/zititest/go.mod @@ -13,14 +13,14 @@ require ( github.com/gorilla/websocket v1.5.1 github.com/michaelquigley/pfxlog v0.6.10 github.com/openziti/agent v1.0.16 - github.com/openziti/channel/v2 v2.0.121 + github.com/openziti/channel/v2 v2.0.122 github.com/openziti/edge-api v0.26.13 github.com/openziti/fablab v0.5.42 - github.com/openziti/foundation/v2 v2.0.39 - github.com/openziti/identity v1.0.72 - github.com/openziti/sdk-golang v0.23.10 - github.com/openziti/storage v0.2.32 - github.com/openziti/transport/v2 v2.0.124 + github.com/openziti/foundation/v2 v2.0.40 + github.com/openziti/identity v1.0.73 + github.com/openziti/sdk-golang v0.23.14 + github.com/openziti/storage v0.2.33 + github.com/openziti/transport/v2 v2.0.125 github.com/openziti/ziti v0.28.3 github.com/pkg/errors v0.9.1 github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 @@ -65,8 +65,8 @@ require ( github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa // indirect github.com/gaissmai/extnetip v0.4.0 // indirect - github.com/go-acme/lego/v4 v4.15.0 // indirect - github.com/go-jose/go-jose/v3 v3.0.3 // indirect + github.com/go-acme/lego/v4 v4.16.1 // indirect + github.com/go-jose/go-jose/v4 v4.0.1 // indirect github.com/go-logr/logr v1.4.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect @@ -79,7 +79,7 @@ require ( github.com/go-openapi/strfmt v0.23.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect github.com/go-openapi/validate v0.24.0 // indirect - github.com/go-resty/resty/v2 v2.11.0 // indirect + github.com/go-resty/resty/v2 v2.12.0 // indirect github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/gomarkdown/markdown v0.0.0-20230922112808-5421fefb8386 // indirect @@ -100,7 +100,7 @@ require ( github.com/influxdata/influxdb-client-go/v2 v2.13.0 // indirect github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d // indirect github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 // indirect - github.com/jedib0t/go-pretty/v6 v6.5.4 // indirect + github.com/jedib0t/go-pretty/v6 v6.5.6 // indirect github.com/jessevdk/go-flags v1.5.0 // indirect github.com/jinzhu/copier v0.4.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect @@ -137,8 +137,8 @@ require ( github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/openziti/dilithium v0.3.3 // indirect github.com/openziti/jwks v1.0.3 // indirect - github.com/openziti/metrics v1.2.47 // indirect - github.com/openziti/runzmd v1.0.40 // indirect + github.com/openziti/metrics v1.2.48 // indirect + github.com/openziti/runzmd v1.0.41 // indirect github.com/openziti/secretstream v0.1.17 // indirect github.com/openziti/x509-claims v1.0.3 // indirect github.com/openziti/xweb/v2 v2.1.0 // indirect diff --git a/zititest/go.sum b/zititest/go.sum index 1f8ce7fe2..2046b9653 100644 --- a/zititest/go.sum +++ b/zititest/go.sum @@ -202,15 +202,15 @@ github.com/gaissmai/extnetip v0.4.0/go.mod h1:M3NWlyFKaVosQXWXKKeIPK+5VM4U85Dahd github.com/getkin/kin-openapi v0.13.0/go.mod h1:WGRs2ZMM1Q8LR1QBEwUxC6RJEfaBcD0s+pcEVXFuAjw= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-acme/lego/v4 v4.15.0 h1:A7MHEU3b+TDFqhC/HmzMJnzPbyeaYvMZQBbqgvbThhU= -github.com/go-acme/lego/v4 v4.15.0/go.mod h1:eeGhjW4zWT7Ccqa3sY7ayEqFLCAICx+mXgkMHKIkLxg= +github.com/go-acme/lego/v4 v4.16.1 h1:JxZ93s4KG0jL27rZ30UsIgxap6VGzKuREsSkkyzeoCQ= +github.com/go-acme/lego/v4 v4.16.1/go.mod h1:AVvwdPned/IWpD/ihHhMsKnveF7HHYAz/CmtXi7OZoE= github.com/go-chi/chi v4.0.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-jose/go-jose/v3 v3.0.3 h1:fFKWeig/irsp7XD2zBxvnmA/XaRWp5V3CBsZXJF7G7k= -github.com/go-jose/go-jose/v3 v3.0.3/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= +github.com/go-jose/go-jose/v4 v4.0.1 h1:QVEPDE3OluqXBQZDcnNvQrInro2h0e4eqNbnZSWqS6U= +github.com/go-jose/go-jose/v4 v4.0.1/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= @@ -243,8 +243,8 @@ github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+Gr github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58= github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ= -github.com/go-resty/resty/v2 v2.11.0 h1:i7jMfNOJYMp69lq7qozJP+bjgzfAzeOhuGlyDrqxT/8= -github.com/go-resty/resty/v2 v2.11.0/go.mod h1:iiP/OpA0CkcL3IGt1O0+/SIItFUbkkyw5BGXiVdTu+A= +github.com/go-resty/resty/v2 v2.12.0 h1:rsVL8P90LFvkUYq/V5BTVe203WfRIU4gvcf+yfzJzGA= +github.com/go-resty/resty/v2 v2.12.0/go.mod h1:o0yGPrkS3lOe1+eFajk6kBW8ScXzwU3hD69/gt2yB/0= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -411,8 +411,8 @@ github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d h1:/WZ github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/jedib0t/go-pretty/v6 v6.5.4 h1:gOGo0613MoqUcf0xCj+h/V3sHDaZasfv152G6/5l91s= -github.com/jedib0t/go-pretty/v6 v6.5.4/go.mod h1:5LQIxa52oJ/DlDSLv0HEkWOFMDGoWkJb9ss5KqPpJBg= +github.com/jedib0t/go-pretty/v6 v6.5.6 h1:nKXVLqPfAwY7sWcYXdNZZZ2fjqDpAtj9UeWupgfUxSg= +github.com/jedib0t/go-pretty/v6 v6.5.6/go.mod h1:5LQIxa52oJ/DlDSLv0HEkWOFMDGoWkJb9ss5KqPpJBg= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jeremija/gosubmit v0.2.7 h1:At0OhGCFGPXyjPYAsCchoBUhE099pcBXmsb4iZqROIc= github.com/jeremija/gosubmit v0.2.7/go.mod h1:Ui+HS073lCFREXBbdfrJzMB57OI/bdxTiLtrDHHhFPI= @@ -588,32 +588,32 @@ github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYr github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/openziti/agent v1.0.16 h1:9Saji+8hFE1NpzP2XzDhsVJbCrDlhixoLHfOpFt5Z+U= github.com/openziti/agent v1.0.16/go.mod h1:zfm53+PVWoGFzjGGgQdKby5749G6VRYHe+eQJmoVKy4= -github.com/openziti/channel/v2 v2.0.121 h1:dCPNbn0VbGIOrzXHcnjp5p0XzZCbpHKRmMhi9LRex0E= -github.com/openziti/channel/v2 v2.0.121/go.mod h1:f/DLqWVAFF5pDIpse8BRm4ZwhpAFjx0gUGjPEqlPSZE= +github.com/openziti/channel/v2 v2.0.122 h1:MPALuLUuTsW2QJzaoRkrP/wGqhIeWtSsrnxt2Ept5SU= +github.com/openziti/channel/v2 v2.0.122/go.mod h1:n4r/pWTFYJy98hEtf4ATYVHU70OePjoM8JJzrIvXvZg= github.com/openziti/dilithium v0.3.3 h1:PLgQ6PMNLSTzCFbX/h98cmudgz/cU6TmjdSv5NAPD8k= github.com/openziti/dilithium v0.3.3/go.mod h1:vsCjI2AU/hon9e+dLhUFbCNGesJDj2ASgkySOcpmvjo= github.com/openziti/edge-api v0.26.13 h1:lWAHu04nk7a0AEnJBjmwijUIEE+NvNAiOcdg11dxbIY= github.com/openziti/edge-api v0.26.13/go.mod h1:aTRqB9J/6ISbw9+YWjzD0tvWAXY98m8yWcbiGNqAQTU= github.com/openziti/fablab v0.5.42 h1:vENJKfEba2T4sSLwlKDL/IzBYfY8iHnhc4umf6IESiY= github.com/openziti/fablab v0.5.42/go.mod h1:HDT06y1QX8kO8ZQrgHvZmJsvc8iRybESGtlDLDII4ks= -github.com/openziti/foundation/v2 v2.0.39 h1:psv1cTgBErOME4K5TmxolUzz8VabJVhGygsAz6uXAQM= -github.com/openziti/foundation/v2 v2.0.39/go.mod h1:38RikdtjvzDUALm3jT3PSOrU0bHCleRty6bHGdfFyUI= -github.com/openziti/identity v1.0.72 h1:Y14nUtgDiUBWZ6WBo6S1rw5qb57QNnZGhsFnMPqfJB8= -github.com/openziti/identity v1.0.72/go.mod h1:sh1STe6K3EM3K0atBVDLq5jpUxAAFCAQZmIkD0MYIKY= +github.com/openziti/foundation/v2 v2.0.40 h1:8oXL77egZjnQuKuxPTHiBOh+X/I2mSJefIbnLSv8rFI= +github.com/openziti/foundation/v2 v2.0.40/go.mod h1:38RikdtjvzDUALm3jT3PSOrU0bHCleRty6bHGdfFyUI= +github.com/openziti/identity v1.0.73 h1:F1iF/rDQYfDIv4ktqBYwK/0C5Ra/7y92Z5Umrw4c4fk= +github.com/openziti/identity v1.0.73/go.mod h1:SKcvyjTlSIpxJuhYLjayJgB800EJ/nO4Y/Lhh77NE9A= github.com/openziti/jwks v1.0.3 h1:hf8wkb+Cg4nH/HM0KROFd7u+C3DkRVcFZJ7tDV+4icc= github.com/openziti/jwks v1.0.3/go.mod h1:t4xxq8vlXGsPn29kiQVnZBBDDnEoOFqtJoHibkJunQQ= -github.com/openziti/metrics v1.2.47 h1:hIp1xnqLxNc7O0yTHIp65REhYBXj7QWeOiayGDzjRrw= -github.com/openziti/metrics v1.2.47/go.mod h1:pHj/z3HCls4/+dLoQKTURNTnHmwUbjZFZOGzj2X6HeI= -github.com/openziti/runzmd v1.0.40 h1:QQuYr7QHci3PTLZJGjaOpH3uGxRCjGJ3DF1KgxXIzq4= -github.com/openziti/runzmd v1.0.40/go.mod h1:WhNu56fgNpDTMKuiLgsqYJLVso0ByDPADsAQZj9m8Lo= -github.com/openziti/sdk-golang v0.23.10 h1:ygpOt99Rd5ESoH1ExYqBHhZp47s5/DYxyfgTO6uYr7Q= -github.com/openziti/sdk-golang v0.23.10/go.mod h1:07G4gYyZzRt9fb3uxEhwdsgJwDrqEkjuvVnnRlsrfEc= +github.com/openziti/metrics v1.2.48 h1:bDUcWSTWM4vXh4YU8z953Q/vtlUjtH+pSaQviKzB578= +github.com/openziti/metrics v1.2.48/go.mod h1:rLFoXigAFb5clCDqe/RlvFFjlaTr9Li7iEn3OxInmb0= +github.com/openziti/runzmd v1.0.41 h1:Iuwe91Lzq63ux2R6+VIWEvcEKhpKkPb1QVNwrJHOuDA= +github.com/openziti/runzmd v1.0.41/go.mod h1:T79oGLLJNnAhHzcfnlrOR39S2XGkzwYZLZh62xee0wk= +github.com/openziti/sdk-golang v0.23.14 h1:usGFwrc7jcGkvas5TVLWQgdWs/FBUZrORb6jV+KM2eY= +github.com/openziti/sdk-golang v0.23.14/go.mod h1:mM7C6QMcEZwVhBLwmrq8PtBMyBbXXoKr186CDpTx5rI= github.com/openziti/secretstream v0.1.17 h1:bcaPGGpUl0+3GzfQkshKh5slUE7QDXxFq3vyDQgHkCA= github.com/openziti/secretstream v0.1.17/go.mod h1:gosi8ohW+dAHhz1h/MjZEcEVWO0jisWqWjEjmx7oAEs= -github.com/openziti/storage v0.2.32 h1:LmW6AhSZ2fu25afXIOAwJOikUOxiMIMRPSLPKWD5++Y= -github.com/openziti/storage v0.2.32/go.mod h1:ImCFExNWGVW8Pz0UcVw9o38+jcskXIQ/6prrJtDyhE8= -github.com/openziti/transport/v2 v2.0.124 h1:84bq7vyqzGJXPek9qyc/7mtVEhp6KTQMK2msq3hwGkY= -github.com/openziti/transport/v2 v2.0.124/go.mod h1:eQ3011tfSlmBI3cIkcJOf9YP/afj+Jd2EQM6MCHoJCQ= +github.com/openziti/storage v0.2.33 h1:15WKxJ0J1GCNOMmOkoosjoxKN2Hrm4p3g8p9WAiMS9Y= +github.com/openziti/storage v0.2.33/go.mod h1:AbE5KkTVlXVFHRqpc7Ug3eFpNOc1HFBFwNIYn8Rtp+s= +github.com/openziti/transport/v2 v2.0.125 h1:6kDfabGFIE2+UPyvJVtfI43CNKcMwNOrCRX602CbDU4= +github.com/openziti/transport/v2 v2.0.125/go.mod h1:meVOsDPZSO/hNWSA+NGK5sAoeSgWoqfJgKUZlM3iX1E= github.com/openziti/x509-claims v1.0.3 h1:HNdQ8Nf1agB3lBs1gahcO6zfkeS4S5xoQ2/PkY4HRX0= github.com/openziti/x509-claims v1.0.3/go.mod h1:Z0WIpBm6c4ecrpRKrou6Gk2wrLWxJO/+tuUwKh8VewE= github.com/openziti/xweb/v2 v2.1.0 h1:Xhh3C2pZkq/Prr65V+SfFSibLDYteoc4f62KQCcTZF4= @@ -888,7 +888,6 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= @@ -989,7 +988,7 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1102,7 +1101,6 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= @@ -1111,7 +1109,6 @@ golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuX golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= @@ -1127,14 +1124,12 @@ golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From 349104ff22c088701d7c62a7d410d38943d43651 Mon Sep 17 00:00:00 2001 From: Paul Lorenz Date: Mon, 25 Mar 2024 14:59:30 -0400 Subject: [PATCH 29/29] Fix dependabot config --- .github/dependabot.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index f7537a397..7431f3fe6 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -11,15 +11,16 @@ updates: update-types: - "minor" - "patch" - include-patterns: + patterns: - "openziti" - non-major: + third-party: applies-to: version-updates update-types: - "minor" - "patch" exclude-patterns: + - "openziti" - "rabbitmq" - "blackfriday" - "zitadel" @@ -32,3 +33,7 @@ updates: groups: all: applies-to: version-updates + update-types: + - "major" + - "minor" + - "patch"