diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index e62b5d7b2..7431f3fe6 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -1,12 +1,39 @@
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"
+ patterns:
+ - "openziti"
+
+ third-party:
+ applies-to: version-updates
+ update-types:
+ - "minor"
+ - "patch"
+ exclude-patterns:
+ - "openziti"
+ - "rabbitmq"
+ - "blackfriday"
+ - "zitadel"
+
+- package-ecosystem: github-actions
+ directory: "/"
+ schedule:
+ interval: weekly
+ open-pull-requests-limit: 10
+ groups:
+ all:
+ applies-to: version-updates
+ update-types:
+ - "major"
+ - "minor"
+ - "patch"
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
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 226940495..69c612182 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,34 @@
+# Release 0.34.0
+
+## 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.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.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
## What's New
@@ -8,7 +39,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/common/ctrl_msg/messages.go b/common/ctrl_msg/messages.go
index 96a8524ab..00e0ff02b 100644
--- a/common/ctrl_msg/messages.go
+++ b/common/ctrl_msg/messages.go
@@ -87,12 +87,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..0100dcb4f
--- /dev/null
+++ b/common/event_cache.go
@@ -0,0 +1,240 @@
+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.lock.Lock()
+ defer cache.lock.Unlock()
+ 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 {
+ 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 (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 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()
+
+ 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) 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()
+
+ // 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 dfa6c0220..199158235 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 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,301 +983,23 @@ 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 {
+func (x *DataState) GetEvents() []*DataState_Event {
if x != nil {
- return x.SyncId
- }
- return ""
-}
-
-func (x *Config) GetId() string {
- if x != nil {
- return x.Id
- }
- return ""
-}
-
-func (x *Config) GetType() ConfigType {
- if x != nil {
- return x.Type
- }
- return ConfigType_Add
-}
-
-func (x *Config) GetSignerKeys() [][]byte {
- if x != nil {
- return x.SignerKeys
+ return x.Events
}
return nil
}
-func (x *Config) GetIdentities() []*Identity {
+func (x *DataState) GetEndIndex() uint64 {
if x != nil {
- return x.Identities
+ return x.EndIndex
}
- return nil
-}
-
-func (x *Config) GetServices() []*Service {
- if x != nil {
- return x.Services
- }
- return nil
-}
-
-func (x *Config) GetPostureSet() []*PostureSet {
- if x != nil {
- return x.PostureSet
- }
- return nil
-}
-
-func (x *Config) GetPostureChecks() []*PostureCheck {
- if x != nil {
- return x.PostureChecks
- }
- return nil
-}
-
-type SignerCerts struct {
- state protoimpl.MessageState
- sizeCache protoimpl.SizeCache
- unknownFields protoimpl.UnknownFields
-
- Keys [][]byte `protobuf:"bytes,1,rep,name=keys,proto3" json:"keys,omitempty"`
-}
-
-func (x *SignerCerts) Reset() {
- *x = SignerCerts{}
- if protoimpl.UnsafeEnabled {
- mi := &file_edge_ctrl_proto_msgTypes[7]
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- ms.StoreMessageInfo(mi)
- }
-}
-
-func (x *SignerCerts) String() string {
- return protoimpl.X.MessageStringOf(x)
-}
-
-func (*SignerCerts) ProtoMessage() {}
-
-func (x *SignerCerts) ProtoReflect() protoreflect.Message {
- mi := &file_edge_ctrl_proto_msgTypes[7]
- if protoimpl.UnsafeEnabled && x != nil {
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- if ms.LoadMessageInfo() == nil {
- ms.StoreMessageInfo(mi)
- }
- return ms
- }
- return mi.MessageOf(x)
-}
-
-// Deprecated: Use SignerCerts.ProtoReflect.Descriptor instead.
-func (*SignerCerts) Descriptor() ([]byte, []int) {
- return file_edge_ctrl_proto_rawDescGZIP(), []int{7}
-}
-
-func (x *SignerCerts) GetKeys() [][]byte {
- if x != nil {
- return x.Keys
- }
- return nil
-}
-
-type 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"`
- ServiceIds []string `protobuf:"bytes,3,rep,name=serviceIds,proto3" json:"serviceIds,omitempty"`
-}
-
-func (x *Identity) Reset() {
- *x = Identity{}
- if protoimpl.UnsafeEnabled {
- mi := &file_edge_ctrl_proto_msgTypes[8]
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- ms.StoreMessageInfo(mi)
- }
-}
-
-func (x *Identity) String() string {
- return protoimpl.X.MessageStringOf(x)
-}
-
-func (*Identity) ProtoMessage() {}
-
-func (x *Identity) ProtoReflect() protoreflect.Message {
- mi := &file_edge_ctrl_proto_msgTypes[8]
- if protoimpl.UnsafeEnabled && x != nil {
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- if ms.LoadMessageInfo() == nil {
- ms.StoreMessageInfo(mi)
- }
- return ms
- }
- return mi.MessageOf(x)
-}
-
-// Deprecated: Use Identity.ProtoReflect.Descriptor instead.
-func (*Identity) Descriptor() ([]byte, []int) {
- return file_edge_ctrl_proto_rawDescGZIP(), []int{8}
-}
-
-func (x *Identity) GetId() string {
- if x != nil {
- return x.Id
- }
- return ""
-}
-
-func (x *Identity) GetName() string {
- if x != nil {
- return x.Name
- }
- return ""
-}
-
-func (x *Identity) GetServiceIds() []string {
- if x != nil {
- return x.ServiceIds
- }
- return nil
-}
-
-type PostureSet 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"`
-}
-
-func (x *PostureSet) Reset() {
- *x = PostureSet{}
- if protoimpl.UnsafeEnabled {
- mi := &file_edge_ctrl_proto_msgTypes[9]
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- ms.StoreMessageInfo(mi)
- }
-}
-
-func (x *PostureSet) String() string {
- return protoimpl.X.MessageStringOf(x)
-}
-
-func (*PostureSet) ProtoMessage() {}
-
-func (x *PostureSet) ProtoReflect() protoreflect.Message {
- mi := &file_edge_ctrl_proto_msgTypes[9]
- if protoimpl.UnsafeEnabled && x != nil {
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- if ms.LoadMessageInfo() == nil {
- ms.StoreMessageInfo(mi)
- }
- return ms
- }
- return mi.MessageOf(x)
-}
-
-// Deprecated: Use PostureSet.ProtoReflect.Descriptor instead.
-func (*PostureSet) Descriptor() ([]byte, []int) {
- return file_edge_ctrl_proto_rawDescGZIP(), []int{9}
-}
-
-func (x *PostureSet) GetId() string {
- if x != nil {
- return x.Id
- }
- return ""
-}
-
-func (x *PostureSet) GetName() string {
- if x != nil {
- return x.Name
- }
- return ""
-}
-
-func (x *PostureSet) GetPostureCheckIds() []string {
- if x != nil {
- return x.PostureCheckIds
- }
- return nil
-}
-
-type PostureCheck 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"`
-}
-
-func (x *PostureCheck) Reset() {
- *x = PostureCheck{}
- if protoimpl.UnsafeEnabled {
- mi := &file_edge_ctrl_proto_msgTypes[10]
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- ms.StoreMessageInfo(mi)
- }
-}
-
-func (x *PostureCheck) String() string {
- return protoimpl.X.MessageStringOf(x)
-}
-
-func (*PostureCheck) ProtoMessage() {}
-
-func (x *PostureCheck) ProtoReflect() protoreflect.Message {
- mi := &file_edge_ctrl_proto_msgTypes[10]
- if protoimpl.UnsafeEnabled && x != nil {
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- if ms.LoadMessageInfo() == nil {
- ms.StoreMessageInfo(mi)
- }
- return ms
- }
- return mi.MessageOf(x)
-}
-
-// Deprecated: Use PostureCheck.ProtoReflect.Descriptor instead.
-func (*PostureCheck) 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 {
- if x != nil {
- return x.Data
- }
- return nil
+ return 0
}
type Session struct {
@@ -1198,7 +1019,7 @@ type Session struct {
func (x *Session) Reset() {
*x = Session{}
if protoimpl.UnsafeEnabled {
- mi := &file_edge_ctrl_proto_msgTypes[11]
+ mi := &file_edge_ctrl_proto_msgTypes[7]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1211,7 +1032,7 @@ func (x *Session) String() string {
func (*Session) ProtoMessage() {}
func (x *Session) ProtoReflect() protoreflect.Message {
- mi := &file_edge_ctrl_proto_msgTypes[11]
+ mi := &file_edge_ctrl_proto_msgTypes[7]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1224,7 +1045,7 @@ func (x *Session) ProtoReflect() protoreflect.Message {
// Deprecated: Use Session.ProtoReflect.Descriptor instead.
func (*Session) Descriptor() ([]byte, []int) {
- return file_edge_ctrl_proto_rawDescGZIP(), []int{11}
+ return file_edge_ctrl_proto_rawDescGZIP(), []int{7}
}
func (x *Session) GetToken() string {
@@ -1289,7 +1110,7 @@ type ApiSession struct {
func (x *ApiSession) Reset() {
*x = ApiSession{}
if protoimpl.UnsafeEnabled {
- mi := &file_edge_ctrl_proto_msgTypes[12]
+ mi := &file_edge_ctrl_proto_msgTypes[8]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1302,7 +1123,7 @@ func (x *ApiSession) String() string {
func (*ApiSession) ProtoMessage() {}
func (x *ApiSession) ProtoReflect() protoreflect.Message {
- mi := &file_edge_ctrl_proto_msgTypes[12]
+ mi := &file_edge_ctrl_proto_msgTypes[8]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1315,7 +1136,7 @@ func (x *ApiSession) ProtoReflect() protoreflect.Message {
// Deprecated: Use ApiSession.ProtoReflect.Descriptor instead.
func (*ApiSession) Descriptor() ([]byte, []int) {
- return file_edge_ctrl_proto_rawDescGZIP(), []int{12}
+ return file_edge_ctrl_proto_rawDescGZIP(), []int{8}
}
func (x *ApiSession) GetToken() string {
@@ -1351,7 +1172,7 @@ type ApiSessionAdded struct {
func (x *ApiSessionAdded) Reset() {
*x = ApiSessionAdded{}
if protoimpl.UnsafeEnabled {
- mi := &file_edge_ctrl_proto_msgTypes[13]
+ mi := &file_edge_ctrl_proto_msgTypes[9]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1364,7 +1185,7 @@ func (x *ApiSessionAdded) String() string {
func (*ApiSessionAdded) ProtoMessage() {}
func (x *ApiSessionAdded) ProtoReflect() protoreflect.Message {
- mi := &file_edge_ctrl_proto_msgTypes[13]
+ mi := &file_edge_ctrl_proto_msgTypes[9]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1377,7 +1198,7 @@ func (x *ApiSessionAdded) ProtoReflect() protoreflect.Message {
// Deprecated: Use ApiSessionAdded.ProtoReflect.Descriptor instead.
func (*ApiSessionAdded) Descriptor() ([]byte, []int) {
- return file_edge_ctrl_proto_rawDescGZIP(), []int{13}
+ return file_edge_ctrl_proto_rawDescGZIP(), []int{9}
}
func (x *ApiSessionAdded) GetIsFullState() bool {
@@ -1405,7 +1226,7 @@ type ApiSessionUpdated struct {
func (x *ApiSessionUpdated) Reset() {
*x = ApiSessionUpdated{}
if protoimpl.UnsafeEnabled {
- mi := &file_edge_ctrl_proto_msgTypes[14]
+ mi := &file_edge_ctrl_proto_msgTypes[10]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1418,7 +1239,7 @@ func (x *ApiSessionUpdated) String() string {
func (*ApiSessionUpdated) ProtoMessage() {}
func (x *ApiSessionUpdated) ProtoReflect() protoreflect.Message {
- mi := &file_edge_ctrl_proto_msgTypes[14]
+ mi := &file_edge_ctrl_proto_msgTypes[10]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1431,7 +1252,7 @@ func (x *ApiSessionUpdated) ProtoReflect() protoreflect.Message {
// Deprecated: Use ApiSessionUpdated.ProtoReflect.Descriptor instead.
func (*ApiSessionUpdated) Descriptor() ([]byte, []int) {
- return file_edge_ctrl_proto_rawDescGZIP(), []int{14}
+ return file_edge_ctrl_proto_rawDescGZIP(), []int{10}
}
func (x *ApiSessionUpdated) GetApiSessions() []*ApiSession {
@@ -1453,7 +1274,7 @@ type ApiSessionRemoved struct {
func (x *ApiSessionRemoved) Reset() {
*x = ApiSessionRemoved{}
if protoimpl.UnsafeEnabled {
- mi := &file_edge_ctrl_proto_msgTypes[15]
+ mi := &file_edge_ctrl_proto_msgTypes[11]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1466,7 +1287,7 @@ func (x *ApiSessionRemoved) String() string {
func (*ApiSessionRemoved) ProtoMessage() {}
func (x *ApiSessionRemoved) ProtoReflect() protoreflect.Message {
- mi := &file_edge_ctrl_proto_msgTypes[15]
+ mi := &file_edge_ctrl_proto_msgTypes[11]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1479,7 +1300,7 @@ func (x *ApiSessionRemoved) ProtoReflect() protoreflect.Message {
// Deprecated: Use ApiSessionRemoved.ProtoReflect.Descriptor instead.
func (*ApiSessionRemoved) Descriptor() ([]byte, []int) {
- return file_edge_ctrl_proto_rawDescGZIP(), []int{15}
+ return file_edge_ctrl_proto_rawDescGZIP(), []int{11}
}
func (x *ApiSessionRemoved) GetTokens() []string {
@@ -1507,7 +1328,7 @@ type ApiSessionHeartbeat struct {
func (x *ApiSessionHeartbeat) Reset() {
*x = ApiSessionHeartbeat{}
if protoimpl.UnsafeEnabled {
- mi := &file_edge_ctrl_proto_msgTypes[16]
+ mi := &file_edge_ctrl_proto_msgTypes[12]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1520,7 +1341,7 @@ func (x *ApiSessionHeartbeat) String() string {
func (*ApiSessionHeartbeat) ProtoMessage() {}
func (x *ApiSessionHeartbeat) ProtoReflect() protoreflect.Message {
- mi := &file_edge_ctrl_proto_msgTypes[16]
+ mi := &file_edge_ctrl_proto_msgTypes[12]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1533,7 +1354,7 @@ func (x *ApiSessionHeartbeat) ProtoReflect() protoreflect.Message {
// Deprecated: Use ApiSessionHeartbeat.ProtoReflect.Descriptor instead.
func (*ApiSessionHeartbeat) Descriptor() ([]byte, []int) {
- return file_edge_ctrl_proto_rawDescGZIP(), []int{16}
+ return file_edge_ctrl_proto_rawDescGZIP(), []int{12}
}
func (x *ApiSessionHeartbeat) GetTokens() []string {
@@ -1555,7 +1376,7 @@ type SessionRemoved struct {
func (x *SessionRemoved) Reset() {
*x = SessionRemoved{}
if protoimpl.UnsafeEnabled {
- mi := &file_edge_ctrl_proto_msgTypes[17]
+ mi := &file_edge_ctrl_proto_msgTypes[13]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1568,7 +1389,7 @@ func (x *SessionRemoved) String() string {
func (*SessionRemoved) ProtoMessage() {}
func (x *SessionRemoved) ProtoReflect() protoreflect.Message {
- mi := &file_edge_ctrl_proto_msgTypes[17]
+ mi := &file_edge_ctrl_proto_msgTypes[13]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1581,7 +1402,7 @@ func (x *SessionRemoved) ProtoReflect() protoreflect.Message {
// Deprecated: Use SessionRemoved.ProtoReflect.Descriptor instead.
func (*SessionRemoved) Descriptor() ([]byte, []int) {
- return file_edge_ctrl_proto_rawDescGZIP(), []int{17}
+ return file_edge_ctrl_proto_rawDescGZIP(), []int{13}
}
func (x *SessionRemoved) GetTokens() []string {
@@ -1609,7 +1430,7 @@ type RequestClientReSync struct {
func (x *RequestClientReSync) Reset() {
*x = RequestClientReSync{}
if protoimpl.UnsafeEnabled {
- mi := &file_edge_ctrl_proto_msgTypes[18]
+ mi := &file_edge_ctrl_proto_msgTypes[14]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1622,7 +1443,7 @@ func (x *RequestClientReSync) String() string {
func (*RequestClientReSync) ProtoMessage() {}
func (x *RequestClientReSync) ProtoReflect() protoreflect.Message {
- mi := &file_edge_ctrl_proto_msgTypes[18]
+ mi := &file_edge_ctrl_proto_msgTypes[14]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1635,7 +1456,7 @@ func (x *RequestClientReSync) ProtoReflect() protoreflect.Message {
// Deprecated: Use RequestClientReSync.ProtoReflect.Descriptor instead.
func (*RequestClientReSync) Descriptor() ([]byte, []int) {
- return file_edge_ctrl_proto_rawDescGZIP(), []int{18}
+ return file_edge_ctrl_proto_rawDescGZIP(), []int{14}
}
func (x *RequestClientReSync) GetReason() string {
@@ -1654,12 +1475,13 @@ type CreateCircuitRequest struct {
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 *CreateCircuitRequest) Reset() {
*x = CreateCircuitRequest{}
if protoimpl.UnsafeEnabled {
- mi := &file_edge_ctrl_proto_msgTypes[19]
+ mi := &file_edge_ctrl_proto_msgTypes[15]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1672,7 +1494,7 @@ func (x *CreateCircuitRequest) String() string {
func (*CreateCircuitRequest) ProtoMessage() {}
func (x *CreateCircuitRequest) ProtoReflect() protoreflect.Message {
- mi := &file_edge_ctrl_proto_msgTypes[19]
+ mi := &file_edge_ctrl_proto_msgTypes[15]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1685,7 +1507,7 @@ func (x *CreateCircuitRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use CreateCircuitRequest.ProtoReflect.Descriptor instead.
func (*CreateCircuitRequest) Descriptor() ([]byte, []int) {
- return file_edge_ctrl_proto_rawDescGZIP(), []int{19}
+ return file_edge_ctrl_proto_rawDescGZIP(), []int{15}
}
func (x *CreateCircuitRequest) GetSessionToken() string {
@@ -1716,6 +1538,13 @@ func (x *CreateCircuitRequest) GetPeerData() map[uint32][]byte {
return nil
}
+func (x *CreateCircuitRequest) GetApiSessionToken() string {
+ if x != nil {
+ return x.ApiSessionToken
+ }
+ return ""
+}
+
type CreateCircuitResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -1730,7 +1559,7 @@ type CreateCircuitResponse struct {
func (x *CreateCircuitResponse) Reset() {
*x = CreateCircuitResponse{}
if protoimpl.UnsafeEnabled {
- mi := &file_edge_ctrl_proto_msgTypes[20]
+ mi := &file_edge_ctrl_proto_msgTypes[16]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1743,7 +1572,7 @@ func (x *CreateCircuitResponse) String() string {
func (*CreateCircuitResponse) ProtoMessage() {}
func (x *CreateCircuitResponse) ProtoReflect() protoreflect.Message {
- mi := &file_edge_ctrl_proto_msgTypes[20]
+ mi := &file_edge_ctrl_proto_msgTypes[16]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1756,7 +1585,7 @@ func (x *CreateCircuitResponse) ProtoReflect() protoreflect.Message {
// 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 {
@@ -3054,7 +2923,7 @@ type CreateTunnelTerminatorRequest struct {
func (x *CreateTunnelTerminatorRequest) Reset() {
*x = CreateTunnelTerminatorRequest{}
if protoimpl.UnsafeEnabled {
- mi := &file_edge_ctrl_proto_msgTypes[37]
+ mi := &file_edge_ctrl_proto_msgTypes[33]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -3067,7 +2936,7 @@ func (x *CreateTunnelTerminatorRequest) String() string {
func (*CreateTunnelTerminatorRequest) ProtoMessage() {}
func (x *CreateTunnelTerminatorRequest) ProtoReflect() protoreflect.Message {
- mi := &file_edge_ctrl_proto_msgTypes[37]
+ mi := &file_edge_ctrl_proto_msgTypes[33]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -3080,7 +2949,7 @@ func (x *CreateTunnelTerminatorRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use CreateTunnelTerminatorRequest.ProtoReflect.Descriptor instead.
func (*CreateTunnelTerminatorRequest) Descriptor() ([]byte, []int) {
- return file_edge_ctrl_proto_rawDescGZIP(), []int{37}
+ return file_edge_ctrl_proto_rawDescGZIP(), []int{33}
}
func (x *CreateTunnelTerminatorRequest) GetServiceName() string {
@@ -3160,7 +3029,7 @@ type CreateTunnelTerminatorResponse struct {
func (x *CreateTunnelTerminatorResponse) Reset() {
*x = CreateTunnelTerminatorResponse{}
if protoimpl.UnsafeEnabled {
- mi := &file_edge_ctrl_proto_msgTypes[38]
+ mi := &file_edge_ctrl_proto_msgTypes[34]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -3173,7 +3042,7 @@ func (x *CreateTunnelTerminatorResponse) String() string {
func (*CreateTunnelTerminatorResponse) ProtoMessage() {}
func (x *CreateTunnelTerminatorResponse) ProtoReflect() protoreflect.Message {
- mi := &file_edge_ctrl_proto_msgTypes[38]
+ mi := &file_edge_ctrl_proto_msgTypes[34]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -3186,7 +3055,7 @@ func (x *CreateTunnelTerminatorResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use CreateTunnelTerminatorResponse.ProtoReflect.Descriptor instead.
func (*CreateTunnelTerminatorResponse) Descriptor() ([]byte, []int) {
- return file_edge_ctrl_proto_rawDescGZIP(), []int{38}
+ return file_edge_ctrl_proto_rawDescGZIP(), []int{34}
}
func (x *CreateTunnelTerminatorResponse) GetApiSession() *CreateApiSessionResponse {
@@ -3232,7 +3101,7 @@ type UpdateTunnelTerminatorRequest struct {
func (x *UpdateTunnelTerminatorRequest) Reset() {
*x = UpdateTunnelTerminatorRequest{}
if protoimpl.UnsafeEnabled {
- mi := &file_edge_ctrl_proto_msgTypes[39]
+ mi := &file_edge_ctrl_proto_msgTypes[35]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -3245,7 +3114,7 @@ func (x *UpdateTunnelTerminatorRequest) String() string {
func (*UpdateTunnelTerminatorRequest) ProtoMessage() {}
func (x *UpdateTunnelTerminatorRequest) ProtoReflect() protoreflect.Message {
- mi := &file_edge_ctrl_proto_msgTypes[39]
+ mi := &file_edge_ctrl_proto_msgTypes[35]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -3258,7 +3127,7 @@ func (x *UpdateTunnelTerminatorRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use UpdateTunnelTerminatorRequest.ProtoReflect.Descriptor instead.
func (*UpdateTunnelTerminatorRequest) Descriptor() ([]byte, []int) {
- return file_edge_ctrl_proto_rawDescGZIP(), []int{39}
+ return file_edge_ctrl_proto_rawDescGZIP(), []int{35}
}
func (x *UpdateTunnelTerminatorRequest) GetTerminatorId() string {
@@ -3309,7 +3178,7 @@ type EnrollmentExtendRouterRequest struct {
func (x *EnrollmentExtendRouterRequest) Reset() {
*x = EnrollmentExtendRouterRequest{}
if protoimpl.UnsafeEnabled {
- mi := &file_edge_ctrl_proto_msgTypes[40]
+ mi := &file_edge_ctrl_proto_msgTypes[36]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -3322,7 +3191,7 @@ func (x *EnrollmentExtendRouterRequest) String() string {
func (*EnrollmentExtendRouterRequest) ProtoMessage() {}
func (x *EnrollmentExtendRouterRequest) ProtoReflect() protoreflect.Message {
- mi := &file_edge_ctrl_proto_msgTypes[40]
+ mi := &file_edge_ctrl_proto_msgTypes[36]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -3335,7 +3204,7 @@ func (x *EnrollmentExtendRouterRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use EnrollmentExtendRouterRequest.ProtoReflect.Descriptor instead.
func (*EnrollmentExtendRouterRequest) Descriptor() ([]byte, []int) {
- return file_edge_ctrl_proto_rawDescGZIP(), []int{40}
+ return file_edge_ctrl_proto_rawDescGZIP(), []int{36}
}
func (x *EnrollmentExtendRouterRequest) GetClientCertCsr() string {
@@ -3372,7 +3241,7 @@ type EnrollmentCertsResponse struct {
func (x *EnrollmentCertsResponse) Reset() {
*x = EnrollmentCertsResponse{}
if protoimpl.UnsafeEnabled {
- mi := &file_edge_ctrl_proto_msgTypes[41]
+ mi := &file_edge_ctrl_proto_msgTypes[37]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -3385,7 +3254,7 @@ func (x *EnrollmentCertsResponse) String() string {
func (*EnrollmentCertsResponse) ProtoMessage() {}
func (x *EnrollmentCertsResponse) ProtoReflect() protoreflect.Message {
- mi := &file_edge_ctrl_proto_msgTypes[41]
+ mi := &file_edge_ctrl_proto_msgTypes[37]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -3398,7 +3267,7 @@ func (x *EnrollmentCertsResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use EnrollmentCertsResponse.ProtoReflect.Descriptor instead.
func (*EnrollmentCertsResponse) Descriptor() ([]byte, []int) {
- return file_edge_ctrl_proto_rawDescGZIP(), []int{41}
+ return file_edge_ctrl_proto_rawDescGZIP(), []int{37}
}
func (x *EnrollmentCertsResponse) GetClientCertPem() string {
@@ -3433,7 +3302,7 @@ type EnrollmentExtendRouterVerifyRequest struct {
func (x *EnrollmentExtendRouterVerifyRequest) Reset() {
*x = EnrollmentExtendRouterVerifyRequest{}
if protoimpl.UnsafeEnabled {
- mi := &file_edge_ctrl_proto_msgTypes[42]
+ mi := &file_edge_ctrl_proto_msgTypes[38]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -3446,7 +3315,7 @@ func (x *EnrollmentExtendRouterVerifyRequest) String() string {
func (*EnrollmentExtendRouterVerifyRequest) ProtoMessage() {}
func (x *EnrollmentExtendRouterVerifyRequest) ProtoReflect() protoreflect.Message {
- mi := &file_edge_ctrl_proto_msgTypes[42]
+ mi := &file_edge_ctrl_proto_msgTypes[38]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -3459,7 +3328,7 @@ func (x *EnrollmentExtendRouterVerifyRequest) ProtoReflect() protoreflect.Messag
// Deprecated: Use EnrollmentExtendRouterVerifyRequest.ProtoReflect.Descriptor instead.
func (*EnrollmentExtendRouterVerifyRequest) Descriptor() ([]byte, []int) {
- return file_edge_ctrl_proto_rawDescGZIP(), []int{42}
+ return file_edge_ctrl_proto_rawDescGZIP(), []int{38}
}
func (x *EnrollmentExtendRouterVerifyRequest) GetClientCertPem() string {
@@ -3469,665 +3338,1850 @@ func (x *EnrollmentExtendRouterVerifyRequest) GetClientCertPem() string {
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[48]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *DataState_PostureCheck) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DataState_PostureCheck) ProtoMessage() {}
+
+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 {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use DataState_PostureCheck.ProtoReflect.Descriptor instead.
+func (*DataState_PostureCheck) Descriptor() ([]byte, []int) {
+ return file_edge_ctrl_proto_rawDescGZIP(), []int{6, 6}
+}
+
+func (x *DataState_PostureCheck) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+func (x *DataState_PostureCheck) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+func (x *DataState_PostureCheck) GetTypeId() string {
+ if x != nil {
+ return x.TypeId
+ }
+ return ""
+}
+
+func (m *DataState_PostureCheck) GetSubtype() isDataState_PostureCheck_Subtype {
+ if m != nil {
+ return m.Subtype
+ }
+ return nil
+}
+
+func (x *DataState_PostureCheck) GetMac() *DataState_PostureCheck_Mac {
+ if x, ok := x.GetSubtype().(*DataState_PostureCheck_Mac_); ok {
+ return x.Mac
+ }
+ return nil
+}
+
+func (x *DataState_PostureCheck) GetMfa() *DataState_PostureCheck_Mfa {
+ if x, ok := x.GetSubtype().(*DataState_PostureCheck_Mfa_); ok {
+ return x.Mfa
+ }
+ return nil
+}
+
+func (x *DataState_PostureCheck) GetOsList() *DataState_PostureCheck_OsList {
+ if x, ok := x.GetSubtype().(*DataState_PostureCheck_OsList_); ok {
+ return x.OsList
+ }
+ return nil
+}
+
+func (x *DataState_PostureCheck) GetProcess() *DataState_PostureCheck_Process {
+ if x, ok := x.GetSubtype().(*DataState_PostureCheck_Process_); ok {
+ return x.Process
+ }
+ return nil
+}
+
+func (x *DataState_PostureCheck) GetProcessMulti() *DataState_PostureCheck_ProcessMulti {
+ if x, ok := x.GetSubtype().(*DataState_PostureCheck_ProcessMulti_); ok {
+ return x.ProcessMulti
+ }
+ return nil
+}
+
+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
+
+ MacAddresses []string `protobuf:"bytes,1,rep,name=macAddresses,proto3" json:"macAddresses,omitempty"`
+}
+
+func (x *DataState_PostureCheck_Mac) Reset() {
+ *x = DataState_PostureCheck_Mac{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_edge_ctrl_proto_msgTypes[49]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *DataState_PostureCheck_Mac) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DataState_PostureCheck_Mac) ProtoMessage() {}
+
+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 {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// 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 *DataState_PostureCheck_Mac) GetMacAddresses() []string {
+ if x != nil {
+ return x.MacAddresses
+ }
+ return nil
+}
+
+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.TimeoutSeconds
+ }
+ return 0
+}
+
+func (x *DataState_PostureCheck_Mfa) GetPromptOnWake() bool {
+ if x != nil {
+ return x.PromptOnWake
+ }
+ return false
+}
+
+func (x *DataState_PostureCheck_Mfa) GetPromptOnUnlock() bool {
+ if x != nil {
+ return x.PromptOnUnlock
+ }
+ return false
+}
+
+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
+
+ 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 *DataState_PostureCheck_Os) Reset() {
+ *x = DataState_PostureCheck_Os{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_edge_ctrl_proto_msgTypes[51]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *DataState_PostureCheck_Os) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DataState_PostureCheck_Os) ProtoMessage() {}
+
+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 {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// 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 *DataState_PostureCheck_Os) GetOsType() string {
+ if x != nil {
+ return x.OsType
+ }
+ return ""
+}
+
+func (x *DataState_PostureCheck_Os) GetOsVersions() []string {
+ if x != nil {
+ return x.OsVersions
+ }
+ return nil
+}
+
+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)
+ }
+}
+
+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 mi.MessageOf(x)
+}
+
+// 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.OsList
+ }
+ return nil
+}
+
+type DataState_PostureCheck_Process struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ 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 *DataState_PostureCheck_Process) Reset() {
+ *x = DataState_PostureCheck_Process{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_edge_ctrl_proto_msgTypes[53]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *DataState_PostureCheck_Process) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DataState_PostureCheck_Process) ProtoMessage() {}
+
+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 {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// 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 *DataState_PostureCheck_Process) GetOsType() string {
+ if x != nil {
+ return x.OsType
+ }
+ return ""
+}
+
+func (x *DataState_PostureCheck_Process) GetPath() string {
+ if x != nil {
+ return x.Path
+ }
+ return ""
+}
+
+func (x *DataState_PostureCheck_Process) GetHashes() []string {
+ if x != nil {
+ return x.Hashes
+ }
+ return nil
+}
+
+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
+
+ 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 *DataState_PostureCheck_ProcessMulti) Reset() {
+ *x = DataState_PostureCheck_ProcessMulti{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_edge_ctrl_proto_msgTypes[54]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *DataState_PostureCheck_ProcessMulti) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DataState_PostureCheck_ProcessMulti) ProtoMessage() {}
+
+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 {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// 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 *DataState_PostureCheck_ProcessMulti) GetSemantic() string {
+ if x != nil {
+ return x.Semantic
+ }
+ return ""
+}
+
+func (x *DataState_PostureCheck_ProcessMulti) GetProcesses() []*DataState_PostureCheck_Process {
+ if x != nil {
+ return x.Processes
+ }
+ return nil
+}
+
+type DataState_PostureCheck_Domains struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Domains []string `protobuf:"bytes,1,rep,name=domains,proto3" json:"domains,omitempty"`
+}
+
+func (x *DataState_PostureCheck_Domains) Reset() {
+ *x = DataState_PostureCheck_Domains{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_edge_ctrl_proto_msgTypes[55]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *DataState_PostureCheck_Domains) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DataState_PostureCheck_Domains) ProtoMessage() {}
+
+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 {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// 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 *DataState_PostureCheck_Domains) GetDomains() []string {
+ if x != nil {
+ return x.Domains
+ }
+ 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,
+ 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,
- 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,
- 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,
- 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,
- 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,
+ 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, 0xba, 0x9f, 0x01, 0x12, 0x28, 0x0a, 0x22, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54,
+ 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,
+ 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, 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, 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,54 +5430,6 @@ func file_edge_ctrl_proto_init() {
}
}
file_edge_ctrl_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*SignerCerts); i {
- case 0:
- return &v.state
- case 1:
- return &v.sizeCache
- case 2:
- return &v.unknownFields
- default:
- return nil
- }
- }
- file_edge_ctrl_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*Identity); i {
- case 0:
- return &v.state
- case 1:
- return &v.sizeCache
- case 2:
- return &v.unknownFields
- default:
- return nil
- }
- }
- file_edge_ctrl_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*PostureSet); i {
- case 0:
- return &v.state
- case 1:
- return &v.sizeCache
- case 2:
- return &v.unknownFields
- default:
- return nil
- }
- }
- file_edge_ctrl_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*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[11].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Session); i {
case 0:
return &v.state
@@ -4410,7 +5441,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ApiSession); i {
case 0:
return &v.state
@@ -4422,7 +5453,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ApiSessionAdded); i {
case 0:
return &v.state
@@ -4434,7 +5465,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ApiSessionUpdated); i {
case 0:
return &v.state
@@ -4446,7 +5477,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ApiSessionRemoved); i {
case 0:
return &v.state
@@ -4458,7 +5489,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ApiSessionHeartbeat); i {
case 0:
return &v.state
@@ -4470,7 +5501,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SessionRemoved); i {
case 0:
return &v.state
@@ -4482,7 +5513,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*RequestClientReSync); i {
case 0:
return &v.state
@@ -4494,7 +5525,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*CreateCircuitRequest); i {
case 0:
return &v.state
@@ -4506,7 +5537,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*CreateCircuitResponse); i {
case 0:
return &v.state
@@ -4518,7 +5549,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*CreateTerminatorRequest); i {
case 0:
return &v.state
@@ -4530,7 +5561,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*CreateTerminatorV2Request); i {
case 0:
return &v.state
@@ -4542,7 +5573,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*CreateTerminatorV2Response); i {
case 0:
return &v.state
@@ -4554,7 +5585,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*RemoveTerminatorRequest); i {
case 0:
return &v.state
@@ -4566,7 +5597,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*UpdateTerminatorRequest); i {
case 0:
return &v.state
@@ -4578,7 +5609,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*HealthEventRequest); i {
case 0:
return &v.state
@@ -4590,7 +5621,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ValidateSessionsRequest); i {
case 0:
return &v.state
@@ -4602,7 +5633,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*EnvInfo); i {
case 0:
return &v.state
@@ -4614,7 +5645,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SdkInfo); i {
case 0:
return &v.state
@@ -4626,7 +5657,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*CreateApiSessionRequest); i {
case 0:
return &v.state
@@ -4638,7 +5669,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*CreateApiSessionResponse); i {
case 0:
return &v.state
@@ -4650,7 +5681,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*CreateCircuitForServiceRequest); i {
case 0:
return &v.state
@@ -4662,7 +5693,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*CreateSessionResponse); i {
case 0:
return &v.state
@@ -4674,7 +5705,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*CreateCircuitForServiceResponse); i {
case 0:
return &v.state
@@ -4686,7 +5717,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ServicesList); i {
case 0:
return &v.state
@@ -4698,7 +5729,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*TunnelService); i {
case 0:
return &v.state
@@ -4710,7 +5741,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*CreateTunnelTerminatorRequest); i {
case 0:
return &v.state
@@ -4722,7 +5753,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*CreateTunnelTerminatorResponse); i {
case 0:
return &v.state
@@ -4734,7 +5765,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*UpdateTunnelTerminatorRequest); i {
case 0:
return &v.state
@@ -4746,7 +5777,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*EnrollmentExtendRouterRequest); i {
case 0:
return &v.state
@@ -4758,7 +5789,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*EnrollmentCertsResponse); i {
case 0:
return &v.state
@@ -4770,7 +5801,7 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
- file_edge_ctrl_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {
+ file_edge_ctrl_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*EnrollmentExtendRouterVerifyRequest); i {
case 0:
return &v.state
@@ -4782,14 +5813,198 @@ func file_edge_ctrl_proto_init() {
return nil
}
}
+ 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:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ 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:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ 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:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ 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:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ 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 0b971bcb5..e395fa7e9 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 DataState {
+ repeated Event events = 1;
+ uint64 endIndex = 2;
+ enum Action {
+ Create = 0;
+ Update = 1;
+ Delete = 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 Identity {
+ string id = 1;
+ string name = 2;
+ repeated string servicePolicyIds = 3;
+ }
-message SignerCerts {
- repeated bytes keys = 1;
-}
+ message Service {
+ string id = 1;
+ string name = 2;
+ bool encryptionRequired = 3;
+ }
-message Identity {
- string id = 1;
- string name = 2;
- repeated string serviceIds = 3;
-}
+ message ServicePolicy {
+ string id = 1;
+ string name = 2;
+ repeated string serviceIds = 3;
+ repeated string postureCheckIds =4;
+ repeated string identityIds = 5;
+ }
-message PostureSet {
- string id = 1;
- string name = 2;
- repeated string postureCheckIds = 3;
-}
+ message Revocation {
+ string id = 1;
+ google.protobuf.Timestamp ExpiresAt = 2;
+ }
-message PostureCheck {
- string id = 1;
- string type = 2;
- map data = 3;
+ 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 {
@@ -257,6 +347,7 @@ message RemoveTerminatorRequest {
string sessionToken = 1;
repeated string fingerprints = 2;
string terminatorId = 3;
+ string apiSessionToken = 4;
}
message UpdateTerminatorRequest {
@@ -267,6 +358,7 @@ message UpdateTerminatorRequest {
TerminatorPrecedence precedence = 5;
bool updatePrecedence = 6;
bool updateCost = 7;
+ string apiSessionToken = 8;
}
message HealthEventRequest {
@@ -274,6 +366,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 ed62d6c0a..d07321d8d 100644
--- a/controller/config/config.go
+++ b/controller/config/config.go
@@ -495,7 +495,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
}
@@ -505,7 +505,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
@@ -514,7 +514,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 aefec258a..2e9016515 100644
--- a/controller/controller.go
+++ b/controller/controller.go
@@ -101,6 +101,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
}
@@ -133,6 +148,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/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..7988092dc 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() {
@@ -257,7 +265,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_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/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/controller_store.go b/controller/db/controller_store.go
new file mode 100644
index 000000000..b83180bc5
--- /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 EntityTypeControllers
+}
+
+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/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/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/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/stores.go b/controller/db/stores.go
index 2ee31eebe..837c1c3a4 100644
--- a/controller/db/stores.go
+++ b/controller/db/stores.go
@@ -103,6 +103,7 @@ type Stores struct {
Ca CaStore
Config ConfigStore
ConfigType ConfigTypeStore
+ Controller ControllerStore
EdgeRouter EdgeRouterStore
EdgeRouterPolicy EdgeRouterPolicyStore
EdgeService EdgeServiceStore
@@ -203,6 +204,7 @@ type stores struct {
ca *caStoreImpl
config *configStoreImpl
configType *configTypeStoreImpl
+ controller *controllerStoreImpl
edgeRouter *edgeRouterStoreImpl
edgeRouterPolicy *edgeRouterPolicyStoreImpl
edgeService *edgeServiceStoreImpl
@@ -258,6 +260,7 @@ func InitStores(db boltz.Db, rateLimiter command.RateLimiter) (*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)
@@ -288,6 +291,7 @@ func InitStores(db boltz.Db, rateLimiter command.RateLimiter) (*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/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/appenv.go b/controller/env/appenv.go
index c4e5bd314..f56bf45a1 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"
@@ -83,7 +83,7 @@ const (
type AppEnv struct {
Managers *model.Managers
- Config *edgeConfig.Config
+ Config *config.Config
Versions *ziti.Versions
@@ -91,22 +91,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 +141,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 +263,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 +309,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 +478,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 +510,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 +619,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 +800,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 +961,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..162c8d187 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,16 +73,26 @@ 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)
+ ae.GetHostController().GetPeerSigners()
+
return 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)
+ }
}
}
@@ -145,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
})
@@ -172,3 +186,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)
-
- if traceEnabled {
- pfxlog.ChannelLogger(logcontext.EstablishPath).
- Wire(self.logContext).
- Debug("tracing enabled for this session")
- }
+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
+ }
+
+ 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
+ }
- found := false
+ var apiSessionCertFingerprints []string
+ 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 cd94c09d5..892006a31 100644
--- a/controller/handler_edge_ctrl/create_terminator_v2.go
+++ b/controller/handler_edge_ctrl/create_terminator_v2.go
@@ -66,7 +66,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,
}
@@ -84,7 +84,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/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/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.RespondWithEmptyOk()
- 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.RespondWithError(apierror.NewInvalidMfaTokenError())
}
func (r *CurrentIdentityRouter) createMfa(ae *env.AppEnv, rc *response.RequestContext) {
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/internal/routes/service_router.go b/controller/internal/routes/service_router.go
index 6ba1d2c38..f84bd83ea 100644
--- a/controller/internal/routes/service_router.go
+++ b/controller/internal/routes/service_router.go
@@ -22,6 +22,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/db"
@@ -69,6 +71,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())
@@ -316,3 +324,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..bcafb2fe8 100644
--- a/controller/jwtsigner/jwt.go
+++ b/controller/jwtsigner/jwt.go
@@ -17,30 +17,39 @@
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_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/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_manager.go b/controller/model/api_session_manager.go
index 6469240e9..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())
}
@@ -295,6 +296,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/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/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/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..4c16b76d7 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 {
@@ -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))
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/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/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/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/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/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/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")
}
}
}
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)
+ }
+
+ 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
}
- id := r.FormValue("id")
- code := r.FormValue("code")
ctx := NewHttpChangeCtx(r)
- authRequest, err := l.store.VerifyTotp(ctx, code, id)
+ authRequest, verifyErr := l.store.VerifyTotp(ctx, code, id)
- if err != nil {
+ 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)
+ if responseType == HtmlContentType {
+ http.Redirect(w, r, l.callback(r.Context(), id), http.StatusFound)
+ }
+
+ renderJson(w, http.StatusOK, &rest_model.Empty{})
}
func (l *login) authenticate(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
- }
-
- username := r.FormValue("username")
- password := r.FormValue("password")
- configTypes := r.Form["configTypes"]
-
- id := r.FormValue("id")
-
- if id == "" {
- id = r.URL.Query().Get("id")
+ 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
- http.Redirect(w, r, l.callback(r.Context(), id), http.StatusFound)
+ 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)
+ }
+
+ 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..9294599f3
--- /dev/null
+++ b/controller/oidc_auth/negotiate.go
@@ -0,0 +1,65 @@
+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 "", newNotAcceptableError(acceptHeader)
+}
+
+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..dbba45b2b
--- /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..647906296
--- /dev/null
+++ b/controller/oidc_auth/render.go
@@ -0,0 +1,101 @@
+package oidc_auth
+
+import (
+ "encoding"
+ "errors"
+ "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: "could not marshal, 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)
+
+ if err != nil {
+ pfxlog.Logger().WithError(err).WithField("internalErrPayload", internalErrPayload).Error("could not write the internal error payload, giving up")
+ }
+
+ 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)
+}
+
+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
+ }
+
+ tokenState, err := TokenStateFromContext(ctx)
if err != nil {
return nil, err
}
- claims = appendClaim(claims, CustomClaimIsAdmin, identity.IsAdmin)
- claims = appendClaim(claims, CustomClaimExternalId, identity.ExternalId)
+ tsClaims, err := tokenState.AccessClaims.CustomClaims.ToMap()
- for _, scope := range scopes {
- if strings.HasPrefix(scope, ScopeApiSessionId) {
- apiSessionId := scope[len(ScopeApiSessionId):]
- claims = appendClaim(claims, CustomClaimApiSessionId, apiSessionId)
- }
- }
-
- return claims, nil
+ 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/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/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..1526d2def 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"
+ 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"
-
- "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/internal/routes"
- "github.com/openziti/ziti/controller/model"
)
type Controller struct {
@@ -236,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/server/oidc-api.go b/controller/server/oidc-api.go
index 218ed36ba..af4ea91f5 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")
}
- } else {
- return nil, fmt.Errorf("[edge-oidc.options.secret] must be defined")
+ }
+
+ if oidcConfig.TokenSecret == "" {
+ bytes := make([]byte, 32)
+ _, err := rand.Read(bytes)
+ if err != nil {
+ return nil, fmt.Errorf("could not generate random secret: %w", err)
+ }
+
+ 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..1e2c6f800 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)
+
+ //revocation create/delete/update
+ strategy.revocationHandler = &constraintToIndexedEvents[*db.Revocation]{
+ indexProvider: strategy.indexProvider,
+ createHandler: strategy.RevocationCreate,
+ updateHandler: strategy.RevocationUpdate,
+ deleteHandler: strategy.RevocationDelete,
+ }
+ strategy.ae.GetStores().Revocation.AddEntityConstraint(strategy.revocationHandler)
+
+ 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)
- if err = channel.NewMessage(env.ServerHelloType, buf).WithTimeout(strategy.HelloSendTimeout).Send(rtx.Router.Control); err != nil {
+ msg.PutBoolHeader(int32(edge_ctrl_pb.Header_RouterDataModel), true)
+
+ 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,39 @@ func (strategy *InstantStrategy) ReceiveResync(routerId string, _ *edge_ctrl_pb.
rtx.logger().WithField("strategy", strategy.Type()).Info("received resync from router, queuing")
- strategy.receivedClientHelloQueue <- rtx
+ rtx.RouterModelIndex = nil
+
+ strategy.queueClientHello(rtx)
}
-func (strategy *InstantStrategy) ReceiveClientHello(routerId string, respHello *edge_ctrl_pb.ClientHello) {
+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) {
rtx := strategy.rtxMap.Get(routerId)
if rtx == nil {
@@ -482,6 +586,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 {
@@ -504,21 +616,21 @@ func (strategy *InstantStrategy) ReceiveClientHello(routerId string, respHello *
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) {
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
@@ -534,7 +646,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)
@@ -573,9 +685,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 +776,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 +803,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.LoadById(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.LoadById(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.LoadById(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.LoadById(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.LoadById(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 acquire 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 acquire 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 acquire index", state.FinalState)
+ return
+ }
+
+ //initial state for delete has the actual value, final state is nil
+ h.deleteHandler(index, state.InitialState)
+ }
+ }
+}
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
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..bbfa0ab21 100644
--- a/etc/ctrl.with.edge.yml
+++ b/etc/ctrl.with.edge.yml
@@ -241,6 +241,13 @@ web:
options: { }
- binding: edge-client
options: { }
+ - binding: edge-oidc
+ options:
+ secret: 38de0de7fa283e8c8ef2a7823a6d3e727681ade50b9eb7bee2424197fb22bf18
+ redirectURIs:
+ - "http://localhost:*/auth/callback"
+ - "http://127.0.0.1:*/auth/callback"
+ - "https://oauth.pstmn.io/v1/callback"
commandRateLimiter:
enabled: true
diff --git a/go.mod b/go.mod
index ab52c9f13..3c6d55450 100644
--- a/go.mod
+++ b/go.mod
@@ -17,16 +17,16 @@ 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.21.5
- github.com/go-openapi/runtime v0.27.1
- github.com/go-openapi/spec v0.20.14
+ 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.22.9
- github.com/go-openapi/validate v0.23.0
- github.com/go-resty/resty/v2 v2.11.0
- github.com/golang-jwt/jwt/v5 v5.2.0
+ github.com/go-openapi/swag v0.23.0
+ github.com/go-openapi/validate v0.24.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
github.com/google/uuid v1.6.0
@@ -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.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.122
+ github.com/openziti/edge-api v0.26.13
+ 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.45
- github.com/openziti/runzmd v1.0.38
- github.com/openziti/sdk-golang v0.22.28
- github.com/openziti/secretstream v0.1.16
- github.com/openziti/storage v0.2.30
- github.com/openziti/transport/v2 v2.0.122
+ 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.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
@@ -80,11 +80,11 @@ require (
go.etcd.io/bbolt v1.3.9
go4.org v0.0.0-20180809161055-417644f6feb5
golang.org/x/crypto v0.21.0
- golang.org/x/net v0.21.0
+ golang.org/x/net v0.22.0
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
@@ -112,17 +112,17 @@ 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
- 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/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.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,8 +167,8 @@ 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
@@ -181,12 +181,12 @@ require (
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/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.17.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 9a936a3d5..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=
@@ -218,39 +218,35 @@ 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/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/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.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q=
-github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs=
-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/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/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/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do=
-github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw=
-github.com/go-openapi/strfmt v0.22.1 h1:5Ky8cybT4576C6Ffc+8gYji/wRXCo6Ozm8RaWjPI6jc=
-github.com/go-openapi/strfmt v0.22.1/go.mod h1:OfVoytIXJasDkkGvkb1Cceb3BPyMOwk1FgmyyEw7NYg=
+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.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/validate v0.23.0 h1:2l7PJLzCis4YUGEoW6eoQw3WhyM65WSIcjX6SQnlfDw=
-github.com/go-openapi/validate v0.23.0/go.mod h1:EeiAZ5bmpSIOJV1WLfyYF9qp/B1ZgSaEpHTJHtN5cbE=
-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-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.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=
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=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -285,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=
@@ -311,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=
@@ -340,10 +338,10 @@ 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/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/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.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=
@@ -405,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=
@@ -460,8 +458,8 @@ 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=
github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
@@ -568,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.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.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.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.45 h1:+3zqszLWyFdTgzbsQD90V0yJcC9Ek77qKaIGMQXkAXs=
-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/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=
-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/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.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=
@@ -622,8 +620,8 @@ 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=
github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
@@ -676,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=
@@ -751,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=
@@ -764,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=
@@ -774,10 +768,12 @@ 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/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
+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/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=
@@ -801,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=
@@ -829,8 +823,8 @@ 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.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/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=
@@ -867,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=
@@ -881,8 +874,8 @@ 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=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
@@ -915,8 +908,8 @@ 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=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -968,9 +961,9 @@ 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 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=
@@ -985,8 +978,8 @@ 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=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -1081,8 +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.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
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=
@@ -1091,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=
@@ -1107,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=
@@ -1174,8 +1162,8 @@ 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=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1296,8 +1284,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/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 bea573164..8aa4a0893 100644
--- a/quickstart/docker/all-in-one/compose.yml
+++ b/quickstart/docker/all-in-one/compose.yml
@@ -21,7 +21,7 @@ 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_PORT:-3022}"\
" --password ${ZITI_PWD:-admin}"
@@ -32,19 +32,34 @@ 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_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_ADVERTISED_PORT:-1280}
+ - ${ZITI_ROUTER_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 +70,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:
diff --git a/router/config.go b/router/config.go
index 0a58fed8f..c74cd7abd 100644
--- a/router/config.go
+++ b/router/config.go
@@ -79,6 +79,8 @@ const (
// CtrlRateLimiterMetricWorkTimer is the name of the metric tracking how long successful tasks are taking to complete
CtrlRateLimiterMetricWorkTimer = "ctrl_limiter.work_timer"
+
+ CtrlHaMapKey = "ha"
)
// internalConfigKeys is used to distinguish internally defined configuration vs file configuration
@@ -160,6 +162,9 @@ type Config struct {
InitialDelay time.Duration
}
}
+ Ha struct {
+ Enabled bool
+ }
Proxy *transport.ProxyConfiguration
Plugins []string
src map[interface{}]interface{}
@@ -786,6 +791,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 a71525c82..884ce2809 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..532334194 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().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)
+ }
+
+ 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 57%
rename from router/fabric/manager.go
rename to router/state/manager.go
index 09b9febba..cca41cdb9 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
@@ -70,7 +76,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)
@@ -79,11 +86,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
}
-type StateManagerImpl struct {
- apiSessionsByToken cmap.ConcurrentMap[string, *edge_ctrl_pb.ApiSession]
- activeApiSessions cmap.ConcurrentMap[string, *MapWithMutex]
+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 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]
@@ -96,43 +133,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
+}
- 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
+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)
}
- return valueInMap
- })
+ }
+ }()
+}
+
+func (sm *ManagerImpl) LoadRouterModel(filePath string) {
+ model, err := common.NewReceiverRouterDataModelFromFile(filePath, RouterDataModelListerBufferSize)
+
+ if err != nil {
+ pfxlog.Logger().WithError(err).Errorf("could not load router model from file [%s]", filePath)
+ model = common.NewReceiverRouterDataModel(RouterDataModelListerBufferSize)
}
- pfxlog.Logger().WithField("received", len(keys)).WithField("added", added).WithField("ignored", ignored).Info("received signer public certificates")
+ 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
+ }
+
+ rootPool.AddCert(cert)
+ }
+ }
+
+ opts := x509.VerifyOptions{
+ Roots: rootPool,
+ Intermediates: x509.NewCertPool(),
+ KeyUsages: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth},
+ CurrentTime: cert.NotBefore,
+ }
+
+ 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 {
@@ -140,24 +315,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).
@@ -167,7 +331,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).
@@ -177,7 +341,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)
@@ -193,7 +357,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
@@ -211,7 +375,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)
@@ -226,7 +390,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)
@@ -250,16 +414,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
}
@@ -273,9 +441,10 @@ func (sm *StateManagerImpl) 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 {
@@ -286,15 +455,15 @@ 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) MarkSessionRecentlyRemoved(token string) {
+func (sm *ManagerImpl) MarkSessionRecentlyRemoved(token string) {
sm.recentlyRemovedSessions.Set(token, time.Now())
}
-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() {}
@@ -323,7 +492,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)
@@ -345,7 +514,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)
@@ -357,17 +526,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
@@ -390,7 +559,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
@@ -399,11 +568,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 {
@@ -419,7 +588,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")
@@ -439,11 +608,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) {
@@ -463,7 +649,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() {
@@ -521,7 +707,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 {
@@ -566,30 +761,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)
-
- if !keyFound {
- return nil, fmt.Errorf("key for kid %s not found after refresh", 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 len(certs) == 0 {
+ return nil, errors.New("could not parse certificates, der was empty")
+ }
+
+ return certs[0].PublicKey, nil
+ case edge_ctrl_pb.DataState_PublicKey_PKIXPublicKey:
+ return x509.ParsePKIXPublicKey(publicKey.Data)
}
- return key, nil
-}
-
-func (sm *StateManagerImpl) RefreshSigners() {
- //nothing atm
+ return nil, fmt.Errorf("unsupported public key format: %s", publicKey.Format.String())
}
diff --git a/router/xgress_edge/accept.go b/router/xgress_edge/accept.go
index dc10b7f6a..d15ef96e7 100644
--- a/router/xgress_edge/accept.go
+++ b/router/xgress_edge/accept.go
@@ -38,6 +38,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 +50,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..2ff0ce46c 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 len(certificates) == 0 {
- return errors.New("no client certificates provided")
- }
-
- fpg := cert.NewFingerprintGenerator()
- fingerprints := fpg.FromCerts(certificates)
-
- apiSession := handler.stateManager.GetApiSessionWithTimeout(token, handler.options.lookupApiSessionTimeout)
-
- if apiSession == nil {
- _ = ch.Close()
-
- var subjects []string
-
- for _, cert := range certificates {
- subjects = append(subjects, cert.Subject.String())
- }
-
- 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.AddConnectedApiSessionWithChannel(token, removeListener, ch)
-
- return nil
- }
- }
+ if !ok {
_ = ch.Close()
- return errors.New("invalid client certificate for api session")
+ return errors.New("no token attribute provided")
}
+
+ certificates := ch.Certificates()
+
+ if len(certificates) == 0 {
+ return errors.New("no client certificates provided")
+ }
+
+ fpg := cert.NewFingerprintGenerator()
+ fingerprints := fpg.FromCerts(certificates)
+
+ token := string(byteToken)
+
+ apiSession := handler.stateManager.GetApiSessionWithTimeout(token, handler.options.lookupApiSessionTimeout)
+
+ if apiSession == nil {
+ _ = ch.Close()
+
+ var subjects []string
+
+ for _, curCert := range certificates {
+ subjects = append(subjects, curCert.Subject.String())
+ }
+
+ 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)
+ }
+
+ 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) {
+ 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.AddActiveChannel(ch, apiSession)
+ handler.stateManager.AddConnectedApiSessionWithChannel(token, removeListener, ch)
+
+ return nil
+ }
+ }
+
_ = 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..9ddcb7328 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,16 +125,19 @@ 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),
+ 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/listener.go b/router/xgress_edge/listener.go
index b9a678423..a60b53897 100644
--- a/router/xgress_edge/listener.go
+++ b/router/xgress_edge/listener.go
@@ -21,6 +21,7 @@ import (
"fmt"
"github.com/openziti/ziti/common/ctrl_msg"
"github.com/openziti/ziti/controller/idgen"
+ "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
terminator := &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
- terminator.onClose = self.listener.factory.stateManager.AddEdgeSessionRemovedListener(token, func(token string) {
+ terminator.onClose = self.listener.factory.stateManager.AddEdgeSessionRemovedListener(sessionToken, func(token string) {
terminator.close(self.listener.factory.hostedServices, true, true, "session ended")
})
- self.listener.factory.hostedServices.PutV1(token, terminator)
+ self.listener.factory.hostedServices.PutV1(sessionToken, terminator)
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 {
@@ -365,15 +389,15 @@ 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)
- 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
@@ -430,7 +454,7 @@ func (self *edgeClientConn) processBindV2(req *channel.Message, ch channel.Chann
terminatorId: terminatorId,
MsgChannel: *edge.NewEdgeMsgChannel(self.ch, connId),
edgeClientConn: self,
- token: token,
+ token: sessionToken,
listenerId: listenerId,
cost: cost,
precedence: precedence,
@@ -456,9 +480,9 @@ func (self *edgeClientConn) processBindV2(req *channel.Message, ch channel.Chann
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(token, func(token string) {
+ terminator.onClose = self.listener.factory.stateManager.AddEdgeSessionRemovedListener(sessionToken, func(token string) {
terminator.close(self.listener.factory.hostedServices, true, true, "session ended")
})
}
@@ -502,7 +526,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)
@@ -527,13 +551,12 @@ 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)
connId, _ := req.GetUint32Header(edge.ConnIdHeader)
-
- log := pfxlog.ContextLogger(ch.Label()).WithField("token", token).WithFields(edge.GetLoggerFields(req))
- terminators := self.listener.factory.hostedServices.getRelatedTerminators(connId, token, self)
+ log := pfxlog.ContextLogger(ch.Label()).WithField("sessionToken", sessionToken).WithFields(edge.GetLoggerFields(req))
+ terminators := self.listener.factory.hostedServices.getRelatedTerminators(connId, sessionToken, self)
if len(terminators) == 0 {
log.Error("failed to update bind, no listener found")
@@ -548,11 +571,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,
}
+ 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)
@@ -587,9 +615,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 {
@@ -597,7 +625,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")
@@ -607,12 +635,19 @@ 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,
CheckPassed: checkPassed,
}
+ log = log.WithField("terminator", terminator.terminatorId).WithField("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).WithField("checkPassed", checkPassed)
log.Debug("sending health event")
diff --git a/router/xgress_edge_tunnel/fabric.go b/router/xgress_edge_tunnel/fabric.go
index 7d064aac3..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"
@@ -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 {
@@ -285,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/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/.gitignore b/tests/.gitignore
new file mode 100644
index 000000000..74b967cfb
--- /dev/null
+++ b/tests/.gitignore
@@ -0,0 +1 @@
+*.json.gzip
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.
diff --git a/tests/ats-ctrl.yml b/tests/ats-ctrl.yml
index 64303f5d7..2df914868 100644
--- a/tests/ats-ctrl.yml
+++ b/tests/ats-ctrl.yml
@@ -55,3 +55,8 @@ web:
- binding: fabric
- binding: edge-management
- binding: edge-client
+ - binding: edge-oidc
+ options:
+ redirectURIs:
+ - "http://localhost:*/auth/callback"
+ - "http://127.0.0.1:*/auth/callback"
diff --git a/tests/auth_distributed_test.go b/tests/auth_distributed_test.go
new file mode 100644
index 000000000..f928f072f
--- /dev/null
+++ b/tests/auth_distributed_test.go
@@ -0,0 +1,218 @@
+package tests
+
+import (
+ "context"
+ "crypto/tls"
+ "fmt"
+ "github.com/go-resty/resty/v2"
+ "github.com/google/uuid"
+ "github.com/openziti/ziti/common"
+ "github.com/openziti/ziti/controller/oidc_auth"
+ "github.com/zitadel/oidc/v2/pkg/client/rp"
+ httphelper "github.com/zitadel/oidc/v2/pkg/http"
+ "github.com/zitadel/oidc/v2/pkg/oidc"
+ "net"
+ "net/http"
+ "net/http/cookiejar"
+ "testing"
+ "time"
+)
+
+type testRpServer struct {
+ Server *http.Server
+ Port string
+ Listener net.Listener
+ TokenChan <-chan *oidc.Tokens[*common.IdTokenClaims]
+ CallbackPath string
+ CallbackUri string
+ LoginUri string
+}
+
+func (t *testRpServer) Stop() {
+ _ = t.Server.Shutdown(context.Background())
+}
+
+func (t *testRpServer) Start() {
+ go func() {
+ _ = t.Server.Serve(t.Listener)
+ }()
+
+ //allow the server to actually start so connections aren't simply closed by fast followup requests
+ time.Sleep(100 * time.Millisecond)
+}
+
+func newOidcTestRp(apiHost string) (*testRpServer, error) {
+ tokenOutChan := make(chan *oidc.Tokens[*common.IdTokenClaims], 1)
+ result := &testRpServer{
+ CallbackPath: "/auth/callback",
+ TokenChan: tokenOutChan,
+ }
+ var err error
+
+ // random port on localhost for our auth callback server, glob pattern mattching in controller must be on
+ result.Listener, err = net.Listen("tcp", ":0")
+
+ if err != nil {
+ return nil, fmt.Errorf("could not listen on a random port: %w", err)
+ }
+
+ _, result.Port, _ = net.SplitHostPort(result.Listener.Addr().String())
+
+ result.LoginUri = "http://127.0.0.1:" + result.Port + "/login"
+
+ key := []byte("test1234test1234")
+ urlBase := "https://" + apiHost
+ issuer := urlBase + "/oidc"
+ clientID := "native"
+ clientSecret := ""
+ scopes := []string{"openid", "offline_access"}
+ result.CallbackUri = "http://127.0.0.1:" + result.Port + result.CallbackPath
+
+ cookieHandler := httphelper.NewCookieHandler(key, key, httphelper.WithUnsecure())
+ jar, _ := cookiejar.New(&cookiejar.Options{})
+ httpClient := &http.Client{
+
+ Transport: &http.Transport{
+ TLSClientConfig: &tls.Config{
+ InsecureSkipVerify: true,
+ },
+ Proxy: http.ProxyFromEnvironment,
+ ForceAttemptHTTP2: true,
+ MaxIdleConns: 100,
+ IdleConnTimeout: 90 * time.Second,
+ TLSHandshakeTimeout: 10 * time.Second,
+ ExpectContinueTimeout: 1 * time.Second,
+ },
+ CheckRedirect: nil,
+ Jar: jar,
+ Timeout: 10 * time.Second,
+ }
+
+ options := []rp.Option{
+ rp.WithHTTPClient(httpClient),
+ rp.WithPKCE(cookieHandler),
+ }
+
+ provider, err := rp.NewRelyingPartyOIDC(issuer, clientID, clientSecret, result.CallbackUri, scopes, options...)
+
+ if err != nil {
+ return nil, fmt.Errorf("could not create rp OIDC: %w", err)
+ }
+
+ state := func() string {
+ return uuid.New().String()
+ }
+ serverMux := http.NewServeMux()
+
+ authhandler := rp.AuthURLHandler(state, provider, rp.WithPromptURLParam("Welcome back!"))
+ loginHandler := http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
+ authhandler.ServeHTTP(writer, request)
+ })
+
+ serverMux.Handle("/login", loginHandler)
+
+ marshalToken := func(w http.ResponseWriter, r *http.Request, tokens *oidc.Tokens[*common.IdTokenClaims], state string, relyingParty rp.RelyingParty) {
+ tokenOutChan <- tokens
+ _, _ = w.Write([]byte("done!"))
+ }
+
+ serverMux.Handle(result.CallbackPath, rp.CodeExchangeHandler(marshalToken, provider))
+
+ result.Server = &http.Server{Handler: serverMux}
+
+ return result, nil
+}
+
+func Test_Authenticate_Distributed_Auth(t *testing.T) {
+ ctx := NewTestContext(t)
+ defer ctx.Teardown()
+ ctx.StartServer()
+
+ rpServer, err := newOidcTestRp(ctx.ApiHost)
+ ctx.Req.NoError(err)
+
+ rpServer.Start()
+ defer rpServer.Stop()
+
+ //clientApiUrl, err := url.Parse("https://" + ctx.ApiHost + EdgeClientApiPath)
+ //ctx.Req.NoError(err)
+ //
+ //managementApiUrl, err := url.Parse("https://" + ctx.ApiHost + EdgeManagementApiPath)
+ //ctx.Req.NoError(err)
+
+ t.Run("updb", func(t *testing.T) {
+ ctx.testContextChanged(t)
+
+ client := resty.NewWithClient(ctx.NewHttpClient(ctx.NewTransport()))
+ client.SetRedirectPolicy(resty.DomainCheckRedirectPolicy("127.0.0.1", "localhost"))
+ resp, err := client.R().Get(rpServer.LoginUri)
+
+ ctx.Req.NoError(err)
+ ctx.Req.Equal(http.StatusOK, resp.StatusCode())
+
+ authRequestId := resp.Header().Get(oidc_auth.AuthRequestIdHeader)
+ ctx.Req.NotEmpty(authRequestId)
+
+ opLoginUri := "https://" + resp.RawResponse.Request.URL.Host + "/oidc/login/username"
+
+ resp, err = client.R().SetFormData(map[string]string{"id": authRequestId, "username": ctx.AdminAuthenticator.Username, "password": ctx.AdminAuthenticator.Password}).Post(opLoginUri)
+
+ ctx.Req.NoError(err)
+ ctx.Req.Equal(http.StatusOK, resp.StatusCode())
+
+ var outTokens *oidc.Tokens[*common.IdTokenClaims]
+
+ select {
+ case tokens := <-rpServer.TokenChan:
+ outTokens = tokens
+ case <-time.After(5 * time.Second):
+ ctx.Fail("no tokens received, hit timeout")
+ }
+
+ ctx.Req.NotNil(outTokens)
+ ctx.Req.NotEmpty(outTokens.IDToken)
+ ctx.Req.NotEmpty(outTokens.IDTokenClaims)
+ ctx.Req.NotEmpty(outTokens.AccessToken)
+ ctx.Req.NotEmpty(outTokens.RefreshToken)
+ })
+
+ t.Run("cert", func(t *testing.T) {
+ ctx.testContextChanged(t)
+
+ ctx.RequireAdminManagementApiLogin()
+
+ _, certAuth := ctx.AdminManagementSession.requireCreateIdentityOttEnrollment("test", false)
+
+ client := resty.NewWithClient(ctx.NewHttpClient(ctx.NewTransportWithClientCert(certAuth.cert, certAuth.key)))
+ client.SetRedirectPolicy(resty.DomainCheckRedirectPolicy("127.0.0.1", "localhost"))
+ resp, err := client.R().Get(rpServer.LoginUri)
+
+ ctx.Req.NoError(err)
+ ctx.Req.Equal(http.StatusOK, resp.StatusCode())
+
+ authRequestId := resp.Header().Get(oidc_auth.AuthRequestIdHeader)
+ ctx.Req.NotEmpty(authRequestId)
+
+ opLoginUri := "https://" + resp.RawResponse.Request.URL.Host + "/oidc/login/cert"
+
+ resp, err = client.R().SetFormData(map[string]string{"id": authRequestId}).Post(opLoginUri)
+
+ ctx.Req.NoError(err)
+ ctx.Req.Equal(http.StatusOK, resp.StatusCode())
+
+ var outTokens *oidc.Tokens[*common.IdTokenClaims]
+
+ select {
+ case tokens := <-rpServer.TokenChan:
+ outTokens = tokens
+ case <-time.After(5 * time.Second):
+ ctx.Fail("no tokens received, hit timeout")
+ }
+
+ ctx.Req.NotNil(outTokens)
+ ctx.Req.NotEmpty(outTokens.IDToken)
+ ctx.Req.NotEmpty(outTokens.IDTokenClaims)
+ ctx.Req.NotEmpty(outTokens.AccessToken)
+ ctx.Req.NotEmpty(outTokens.RefreshToken)
+ })
+}
diff --git a/tests/context.go b/tests/context.go
index 049e4ea4e..2d1d2a620 100644
--- a/tests/context.go
+++ b/tests/context.go
@@ -17,38 +17,6 @@
package tests
import (
- "crypto"
- "crypto/ecdsa"
- "crypto/elliptic"
- "crypto/rand"
- cryptoTls "crypto/tls"
- "crypto/x509"
- "encoding/json"
- "encoding/pem"
- "fmt"
- "github.com/go-openapi/strfmt"
- "github.com/google/uuid"
- "github.com/gorilla/websocket"
- "github.com/openziti/channel/v2"
- "github.com/openziti/channel/v2/websockets"
- "github.com/openziti/edge-api/rest_model"
- nfPem "github.com/openziti/foundation/v2/pem"
- "github.com/openziti/foundation/v2/versions"
- "github.com/openziti/identity/certtools"
- "github.com/openziti/sdk-golang/ziti"
- "github.com/openziti/sdk-golang/ziti/edge"
- sdkEnroll "github.com/openziti/sdk-golang/ziti/enroll"
- "github.com/openziti/ziti/common"
- "github.com/openziti/ziti/common/eid"
- "github.com/openziti/ziti/controller/env"
- "github.com/openziti/ziti/controller/xt_smartrouting"
- "github.com/openziti/ziti/router"
- "github.com/openziti/ziti/router/enroll"
- "github.com/openziti/ziti/router/fabric"
- "github.com/openziti/ziti/router/xgress"
- "github.com/openziti/ziti/router/xgress_edge"
- "github.com/openziti/ziti/router/xgress_edge_tunnel"
- "github.com/pkg/errors"
"io"
"net"
"net/http"
@@ -62,18 +30,50 @@ import (
"testing"
"time"
- "gopkg.in/resty.v1"
+ "crypto"
+ "crypto/ecdsa"
+ "crypto/elliptic"
+ "crypto/rand"
+ cryptoTls "crypto/tls"
+ "crypto/x509"
+ "encoding/json"
+ "encoding/pem"
+ "fmt"
"github.com/Jeffail/gabs"
+ "github.com/go-openapi/strfmt"
+ "github.com/google/uuid"
+ "github.com/gorilla/websocket"
"github.com/michaelquigley/pfxlog"
+ "github.com/openziti/channel/v2"
+ "github.com/openziti/channel/v2/websockets"
+ "github.com/openziti/edge-api/rest_model"
+ nfPem "github.com/openziti/foundation/v2/pem"
+ "github.com/openziti/foundation/v2/versions"
idlib "github.com/openziti/identity"
+ "github.com/openziti/identity/certtools"
+ "github.com/openziti/sdk-golang/ziti"
+ "github.com/openziti/sdk-golang/ziti/edge"
+ sdkEnroll "github.com/openziti/sdk-golang/ziti/enroll"
"github.com/openziti/transport/v2"
"github.com/openziti/transport/v2/tcp"
"github.com/openziti/transport/v2/tls"
+ "github.com/openziti/ziti/common"
+ "github.com/openziti/ziti/common/eid"
"github.com/openziti/ziti/controller"
+ "github.com/openziti/ziti/controller/env"
"github.com/openziti/ziti/controller/server"
+ "github.com/openziti/ziti/controller/xt_smartrouting"
+ "github.com/openziti/ziti/router"
+ "github.com/openziti/ziti/router/enroll"
+ "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_tunnel"
+ "github.com/pkg/errors"
"github.com/sirupsen/logrus"
"github.com/stretchr/testify/require"
+ "gopkg.in/resty.v1"
)
const (
@@ -228,7 +228,7 @@ func (ctx *TestContext) NewTransportWithClientCert(cert *x509.Certificate, priva
}
func (ctx *TestContext) NewHttpClient(transport *http.Transport) *http.Client {
- jar, err := cookiejar.New(&cookiejar.Options{})
+ jar, err := cookiejar.New(nil)
ctx.Req.NoError(err)
return &http.Client{
@@ -503,7 +503,7 @@ func (ctx *TestContext) startEdgeRouter() {
ctx.Req.NoError(err)
ctx.router = router.Create(config, NewVersionProviderTest())
- stateManager := fabric.NewStateManager()
+ stateManager := state.NewManager(config)
xgressEdgeFactory := xgress_edge.NewFactory(config, ctx.router, stateManager)
xgress.GlobalRegistry().Register(common.EdgeBinding, xgressEdgeFactory)
diff --git a/tests/data_flow_hs_rotating_test.go b/tests/data_flow_hs_rotating_test.go
index 6966e37ac..ef198b5bf 100644
--- a/tests/data_flow_hs_rotating_test.go
+++ b/tests/data_flow_hs_rotating_test.go
@@ -270,7 +270,7 @@ func testServerFirstWithStrategy(t *testing.T, strategy string) {
clientContext, err := ziti.NewContext(clientConfig)
ctx.Req.NoError(err)
-
+
ticker := time.NewTicker(time.Millisecond * 500)
defer ticker.Stop()
diff --git a/tests/identity_api_session_activity_test.go b/tests/identity_api_session_activity_test.go
index 025d0c93f..a2a688a8c 100644
--- a/tests/identity_api_session_activity_test.go
+++ b/tests/identity_api_session_activity_test.go
@@ -42,7 +42,9 @@ func Test_Identity_HasErConnection(t *testing.T) {
caPool, err := ziti.GetControllerWellKnownCaPool("https://" + ctx.ApiHost)
ctx.Req.NoError(err)
- managementClient := edge_apis.NewManagementApiClient(managementUrl, caPool, nil)
+ managementClient := edge_apis.NewManagementApiClient(managementUrl, caPool, func(strings chan string) {
+ strings <- "123"
+ })
curSession, err := managementClient.Authenticate(creds, nil)
ctx.Req.NoError(err)
diff --git a/tests/sdk_auth_test.go b/tests/sdk_auth_test.go
index fddb62a85..12362fa5d 100644
--- a/tests/sdk_auth_test.go
+++ b/tests/sdk_auth_test.go
@@ -32,10 +32,12 @@ func TestSdkAuth(t *testing.T) {
ctx.Req.NoError(err)
adminCreds := edge_apis.NewUpdbCredentials(ctx.AdminAuthenticator.Username, ctx.AdminAuthenticator.Password)
- adminClient := edge_apis.NewManagementApiClient(managementApiUrl, ctx.ControllerConfig.Id.CA(), nil)
+ adminClient := edge_apis.NewManagementApiClient(managementApiUrl, ctx.ControllerConfig.Id.CA(), func(strings chan string) {
+ strings <- "123"
+ })
apiSession, err := adminClient.Authenticate(adminCreds, nil)
- t.Run("management updb", func(t *testing.T) {
+ t.Run("management updb can authenticate", func(t *testing.T) {
ctx.testContextChanged(t)
ctx.Req.NoError(err)
@@ -44,11 +46,13 @@ func TestSdkAuth(t *testing.T) {
ctx.Req.NotNil(apiSession.GetToken())
})
- t.Run("client updb, ca pool on client", func(t *testing.T) {
+ t.Run("client updb, ca pool on client can authenticate", func(t *testing.T) {
ctx.testContextChanged(t)
creds := edge_apis.NewUpdbCredentials(ctx.AdminAuthenticator.Username, ctx.AdminAuthenticator.Password)
- client := edge_apis.NewClientApiClient(clientApiUrl, ctx.ControllerConfig.Id.CA(), nil)
+ client := edge_apis.NewClientApiClient(clientApiUrl, ctx.ControllerConfig.Id.CA(), func(strings chan string) {
+ strings <- "123"
+ })
apiSession, err := client.Authenticate(creds, nil)
ctx.Req.NoError(err)
@@ -57,13 +61,15 @@ func TestSdkAuth(t *testing.T) {
ctx.Req.NotNil(apiSession.GetToken())
})
- t.Run("client updb, ca pool on cert", func(t *testing.T) {
+ t.Run("client updb, ca pool on cert can authenticate", func(t *testing.T) {
ctx.testContextChanged(t)
creds := edge_apis.NewUpdbCredentials(ctx.AdminAuthenticator.Username, ctx.AdminAuthenticator.Password)
creds.CaPool = ctx.ControllerConfig.Id.CA()
- client := edge_apis.NewClientApiClient(clientApiUrl, nil, nil)
+ client := edge_apis.NewClientApiClient(clientApiUrl, nil, func(strings chan string) {
+ strings <- "123"
+ })
apiSession, err := client.Authenticate(creds, nil)
ctx.Req.NoError(err)
@@ -72,11 +78,13 @@ func TestSdkAuth(t *testing.T) {
ctx.Req.NotNil(apiSession.GetToken())
})
- t.Run("management cert, ca pool on client", func(t *testing.T) {
+ t.Run("management cert, ca pool on client can authenticate", func(t *testing.T) {
ctx.testContextChanged(t)
creds := edge_apis.NewCertCredentials([]*x509.Certificate{testIdCerts.cert}, testIdCerts.key)
- client := edge_apis.NewManagementApiClient(managementApiUrl, ctx.ControllerConfig.Id.CA(), nil)
+ client := edge_apis.NewManagementApiClient(managementApiUrl, ctx.ControllerConfig.Id.CA(), func(strings chan string) {
+ strings <- "123"
+ })
apiSession, err := client.Authenticate(creds, nil)
ctx.Req.NoError(rest_util.WrapErr(err))
@@ -85,13 +93,15 @@ func TestSdkAuth(t *testing.T) {
ctx.Req.NotNil(apiSession.GetToken())
})
- t.Run("management cert, ca pool on cert", func(t *testing.T) {
+ t.Run("management cert, ca pool on cert can authenticate", func(t *testing.T) {
ctx.testContextChanged(t)
creds := edge_apis.NewCertCredentials([]*x509.Certificate{testIdCerts.cert}, testIdCerts.key)
creds.CaPool = ctx.ControllerConfig.Id.CA()
- client := edge_apis.NewManagementApiClient(managementApiUrl, nil, nil)
+ client := edge_apis.NewManagementApiClient(managementApiUrl, nil, func(strings chan string) {
+ strings <- "123"
+ })
apiSession, err := client.Authenticate(creds, nil)
err = rest_util.WrapErr(err)
@@ -102,12 +112,14 @@ func TestSdkAuth(t *testing.T) {
ctx.Req.NotNil(apiSession.GetToken())
})
- t.Run("client cert, ca pool on client", func(t *testing.T) {
+ t.Run("client cert, ca pool on client can authenticate", func(t *testing.T) {
ctx.testContextChanged(t)
creds := edge_apis.NewCertCredentials([]*x509.Certificate{testIdCerts.cert}, testIdCerts.key)
- client := edge_apis.NewClientApiClient(clientApiUrl, ctx.ControllerConfig.Id.CA(), nil)
+ client := edge_apis.NewClientApiClient(clientApiUrl, ctx.ControllerConfig.Id.CA(), func(strings chan string) {
+ strings <- "123"
+ })
apiSession, err := client.Authenticate(creds, nil)
err = rest_util.WrapErr(err)
@@ -118,13 +130,15 @@ func TestSdkAuth(t *testing.T) {
ctx.Req.NotNil(apiSession.GetToken())
})
- t.Run("client cert, ca pool on creds", func(t *testing.T) {
+ t.Run("client cert, ca pool on creds can authenticate", func(t *testing.T) {
ctx.testContextChanged(t)
creds := edge_apis.NewCertCredentials([]*x509.Certificate{testIdCerts.cert}, testIdCerts.key)
creds.CaPool = ctx.ControllerConfig.Id.CA()
- client := edge_apis.NewClientApiClient(clientApiUrl, nil, nil)
+ client := edge_apis.NewClientApiClient(clientApiUrl, nil, func(strings chan string) {
+ strings <- "123"
+ })
apiSession, err := client.Authenticate(creds, nil)
err = rest_util.WrapErr(err)
@@ -135,7 +149,7 @@ func TestSdkAuth(t *testing.T) {
ctx.Req.NotNil(apiSession.GetToken())
})
- t.Run("ext jwt signer", func(t *testing.T) {
+ t.Run("ext jwt signer can authenticate", func(t *testing.T) {
ctx.testContextChanged(t)
//valid signer with issuer and audience
@@ -207,6 +221,7 @@ func TestSdkAuth(t *testing.T) {
authPolicyCreateParams.AuthPolicy = authPolicyCreate
createAuthPolicyResp, err := adminClient.API.AuthPolicy.CreateAuthPolicy(authPolicyCreateParams, nil)
+ err = rest_util.WrapErr(err)
ctx.Req.NoError(err)
ctx.Req.NotNil(createAuthPolicyResp)
ctx.Req.NotEmpty(createAuthPolicyResp.Payload.Data.ID)
@@ -232,7 +247,9 @@ func TestSdkAuth(t *testing.T) {
t.Run("client jwt, ca pool on client", func(t *testing.T) {
ctx.testContextChanged(t)
creds := edge_apis.NewJwtCredentials(jwtStrSigned)
- client := edge_apis.NewClientApiClient(clientApiUrl, ctx.ControllerConfig.Id.CA(), nil)
+ client := edge_apis.NewClientApiClient(clientApiUrl, ctx.ControllerConfig.Id.CA(), func(strings chan string) {
+ strings <- "123"
+ })
apiSession, err := client.Authenticate(creds, nil)
ctx.Req.NoError(err)
@@ -246,7 +263,9 @@ func TestSdkAuth(t *testing.T) {
creds := edge_apis.NewJwtCredentials(jwtStrSigned)
creds.CaPool = ctx.ControllerConfig.Id.CA()
- client := edge_apis.NewClientApiClient(clientApiUrl, nil, nil)
+ client := edge_apis.NewClientApiClient(clientApiUrl, nil, func(strings chan string) {
+ strings <- "123"
+ })
apiSession, err := client.Authenticate(creds, nil)
ctx.Req.NoError(err)
@@ -258,7 +277,9 @@ func TestSdkAuth(t *testing.T) {
t.Run("management jwt, ca pool on client", func(t *testing.T) {
ctx.testContextChanged(t)
creds := edge_apis.NewJwtCredentials(jwtStrSigned)
- client := edge_apis.NewManagementApiClient(managementApiUrl, ctx.ControllerConfig.Id.CA(), nil)
+ client := edge_apis.NewManagementApiClient(managementApiUrl, ctx.ControllerConfig.Id.CA(), func(strings chan string) {
+ strings <- "123"
+ })
apiSession, err := client.Authenticate(creds, nil)
ctx.Req.NoError(err)
@@ -272,7 +293,10 @@ func TestSdkAuth(t *testing.T) {
creds := edge_apis.NewJwtCredentials(jwtStrSigned)
creds.CaPool = ctx.ControllerConfig.Id.CA()
- client := edge_apis.NewManagementApiClient(managementApiUrl, nil, nil)
+ client := edge_apis.NewManagementApiClient(managementApiUrl, nil, func(strings chan string) {
+ strings <- "123"
+ })
+
apiSession, err := client.Authenticate(creds, nil)
ctx.Req.NoError(err)
diff --git a/tests/sdk_event_test.go b/tests/sdk_event_test.go
index cb9ae69b1..4f22c1168 100644
--- a/tests/sdk_event_test.go
+++ b/tests/sdk_event_test.go
@@ -31,7 +31,9 @@ func Test_SDK_Events(t *testing.T) {
ctx.Req.NoError(err)
adminCreds := edge_apis.NewUpdbCredentials(ctx.AdminAuthenticator.Username, ctx.AdminAuthenticator.Password)
- adminClient := edge_apis.NewManagementApiClient(managementApiUrl, ctx.ControllerConfig.Id.CA(), nil)
+ adminClient := edge_apis.NewManagementApiClient(managementApiUrl, ctx.ControllerConfig.Id.CA(), func(strings chan string) {
+ strings <- "123"
+ })
apiSession, err := adminClient.Authenticate(adminCreds, nil)
ctx.NoError(err)
ctx.NotNil(apiSession)
@@ -60,9 +62,9 @@ func Test_SDK_Events(t *testing.T) {
ctx.Req.NoError(err)
ctx.Req.NotNil(ztx)
- called := make(chan *edge_apis.ApiSession, 1)
+ called := make(chan edge_apis.ApiSession, 1)
- removeFullListener := ztx.Events().AddAuthenticationStateFullListener(func(ztx ziti.Context, detail *edge_apis.ApiSession) {
+ removeFullListener := ztx.Events().AddAuthenticationStateFullListener(func(ztx ziti.Context, detail edge_apis.ApiSession) {
ctx.Req.NotNil(ztx)
called <- detail
})
@@ -77,7 +79,7 @@ func Test_SDK_Events(t *testing.T) {
case newApiSession := <-called:
ctx.Req.NotNil(newApiSession)
ctx.Req.NotEmpty(newApiSession.GetToken())
- ctx.Req.Empty(newApiSession.AuthQueries, "expected 0 auth queries")
+ ctx.Req.Empty(newApiSession.GetAuthQueries(), "expected 0 auth queries")
case <-time.After(time.Second * 5):
ctx.Req.Fail("time out, full auth event never encountered")
}
@@ -128,9 +130,9 @@ func Test_SDK_Events(t *testing.T) {
ztxPostMfa.Close()
}()
- partialChan := make(chan *edge_apis.ApiSession, 1)
+ partialChan := make(chan edge_apis.ApiSession, 1)
- removePartialListener := ztxPostMfa.Events().AddAuthenticationStatePartialListener(func(ztx ziti.Context, detail *edge_apis.ApiSession) {
+ removePartialListener := ztxPostMfa.Events().AddAuthenticationStatePartialListener(func(ztx ziti.Context, detail edge_apis.ApiSession) {
ctx.Req.NotNil(ztx)
partialChan <- detail
})
@@ -140,7 +142,7 @@ func Test_SDK_Events(t *testing.T) {
select {
case newApiSession := <-partialChan:
- ctx.Req.Len(newApiSession.AuthQueries, 1, "expected 1 auth query")
+ ctx.Req.Len(newApiSession.GetAuthQueries(), 1, "expected 1 auth query")
case <-time.After(5 * time.Second):
ctx.Req.Fail("time out, partial auth event not received")
}
@@ -159,9 +161,9 @@ func Test_SDK_Events(t *testing.T) {
t.Run("EventAuthenticationStateFull emitted after providing MFA TOTP Code", func(t *testing.T) {
ctx.testContextChanged(t)
- fullChan := make(chan *edge_apis.ApiSession, 1)
+ fullChan := make(chan edge_apis.ApiSession, 1)
- fullListenerRemover := ztxPostMfa.Events().AddAuthenticationStateFullListener(func(ztx ziti.Context, detail *edge_apis.ApiSession) {
+ fullListenerRemover := ztxPostMfa.Events().AddAuthenticationStateFullListener(func(ztx ziti.Context, detail edge_apis.ApiSession) {
ctx.Req.NotNil(ztx)
fullChan <- detail
})
@@ -185,7 +187,7 @@ func Test_SDK_Events(t *testing.T) {
case newApiSession := <-fullChan:
ctx.Req.NotNil(newApiSession)
ctx.Req.NotEmpty(newApiSession.GetToken())
- ctx.Req.Empty(newApiSession.AuthQueries, "expected 0 auth queries")
+ ctx.Req.Empty(newApiSession.GetAuthQueries(), "expected 0 auth queries")
case <-time.After(time.Second * 5):
ctx.Req.Fail("time out")
}
@@ -193,9 +195,9 @@ func Test_SDK_Events(t *testing.T) {
t.Run("EventAuthenticationStateUnauthenticated emitted if the current API Session is deleted", func(t *testing.T) {
ctx.testContextChanged(t)
- unauthCalled := make(chan *edge_apis.ApiSession, 1)
+ unauthCalled := make(chan edge_apis.ApiSession, 1)
- removeUnauthedListener := ztxPostMfa.Events().AddAuthenticationStateUnauthenticatedListener(func(ztx ziti.Context, detail *edge_apis.ApiSession) {
+ removeUnauthedListener := ztxPostMfa.Events().AddAuthenticationStateUnauthenticatedListener(func(ztx ziti.Context, detail edge_apis.ApiSession) {
ctx.Req.NotNil(ztx)
ctx.Req.NotNil(detail)
@@ -205,7 +207,7 @@ func Test_SDK_Events(t *testing.T) {
defer removeUnauthedListener()
implZtx := ztxPostMfa.(*ziti.ContextImpl)
- apiSessionId := *implZtx.CtrlClt.ApiSession.Load().ID
+ apiSessionId := implZtx.CtrlClt.GetCurrentApiSession().GetId()
deleteParams := api_session.NewDeleteAPISessionsParams()
deleteParams.ID = apiSessionId
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/ziti/cmd/agentcli/agent_controller_init.go b/ziti/cmd/agentcli/agent_controller_init.go
index c2287cc12..9db592a67 100644
--- a/ziti/cmd/agentcli/agent_controller_init.go
+++ b/ziti/cmd/agentcli/agent_controller_init.go
@@ -42,7 +42,9 @@ func NewAgentCtrlInit(p common.OptionsProvider) *cobra.Command {
RunE: func(cmd *cobra.Command, args []string) error {
action.Cmd = cmd
action.Args = args
- return action.MakeChannelRequest(byte(AgentAppController), action.makeRequest)
+ err := action.MakeChannelRequest(byte(AgentAppController), action.makeRequest)
+
+ return err
},
}
diff --git a/ziti/cmd/create/config_templates/controller.yml b/ziti/cmd/create/config_templates/controller.yml
index d476983e9..49f40f11f 100644
--- a/ziti/cmd/create/config_templates/controller.yml
+++ b/ziti/cmd/create/config_templates/controller.yml
@@ -7,7 +7,18 @@ v: 3
# memory:
# path: ctrl.memprof
+
+{{ if .Controller.Ctrl.MinClusterSize }}
+raft:
+ dataDir: "{{ .ZitiHome }}/raft"
+ minClusterSize: {{ .Controller.Ctrl.MinClusterSize }}
+{{ else }}
db: "{{ .ZitiHome }}/db/ctrl.db"
+# uncomment and configure to enable HA
+# raft:
+# dataDir: "{{ .ZitiHome }}/raft"
+# minClusterSize: 1
+{{ end }}
identity:
cert: "{{ .Controller.Identity.Cert }}"
@@ -70,7 +81,8 @@ identity:
# the endpoint that routers will connect to the controller over.
ctrl:
- #options:
+ options:
+ advertiseAddress: tls:{{ .Controller.EdgeApi.Address }}:{{ .Controller.Ctrl.AdvertisedPort }}
# (optional) settings
# set the maximum number of connect requests that are buffered and waiting to be acknowledged ({{ .Controller.Ctrl.MinQueuedConnects }} to {{ .Controller.Ctrl.MaxQueuedConnects }}, default {{ .Controller.Ctrl.DefaultQueuedConnects }})
#maxQueuedConnects: {{ .Controller.Ctrl.DefaultQueuedConnects }}
@@ -211,6 +223,8 @@ web:
# These settings are per API. The example below is for the 'edge-api' and contains both optional values and
# required values.
options: { }
+ - binding: edge-oidc
+ options: { }
- binding: edge-client
options: { }
- binding: fabric
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.go b/ziti/cmd/create/create_config.go
index 76b6d3924..c29653af4 100644
--- a/ziti/cmd/create/create_config.go
+++ b/ziti/cmd/create/create_config.go
@@ -24,11 +24,11 @@ import (
"time"
"github.com/openziti/channel/v2"
- edge "github.com/openziti/ziti/controller/config"
- fabCtrl "github.com/openziti/ziti/controller"
- fabForwarder "github.com/openziti/ziti/router/forwarder"
foundation "github.com/openziti/transport/v2"
fabXweb "github.com/openziti/xweb/v2"
+ fabCtrl "github.com/openziti/ziti/controller"
+ edge "github.com/openziti/ziti/controller/config"
+ fabForwarder "github.com/openziti/ziti/router/forwarder"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
@@ -72,6 +72,7 @@ type CtrlValues struct {
AdvertisedPort string
BindAddress string
AltAdvertisedAddress string
+ MinClusterSize int
}
type HealthChecksValues struct {
diff --git a/ziti/cmd/create/create_config_controller.go b/ziti/cmd/create/create_config_controller.go
index bd21f570f..bcea029c3 100644
--- a/ziti/cmd/create/create_config_controller.go
+++ b/ziti/cmd/create/create_config_controller.go
@@ -37,6 +37,7 @@ const (
optionDatabaseFile = "databaseFile"
optionEdgeIdentityEnrollmentDuration = "identityEnrollmentDuration"
optionEdgeRouterEnrollmentDuration = "routerEnrollmentDuration"
+ optionMinCluster = "minCluster"
)
var (
@@ -74,6 +75,7 @@ type CreateConfigControllerOptions struct {
CtrlPort string
EdgeIdentityEnrollmentDuration time.Duration
EdgeRouterEnrollmentDuration time.Duration
+ MinCluster int
}
type CreateControllerConfigCmd struct {
@@ -108,6 +110,7 @@ func NewCmdCreateConfigController() *CreateControllerConfigCmd {
}
data.PopulateConfigValues()
+ data.Controller.Ctrl.MinClusterSize = controllerOptions.MinCluster
// Update controller specific values with configOptions passed in if the argument was provided or the value is currently blank
if data.Controller.Ctrl.AdvertisedPort == "" || controllerOptions.CtrlPort != constants.DefaultCtrlAdvertisedPort {
@@ -150,6 +153,7 @@ func (options *CreateConfigControllerOptions) addFlags(cmd *cobra.Command) {
cmd.Flags().StringVar(&options.DatabaseFile, optionDatabaseFile, "ctrl.db", "location of the database file")
cmd.Flags().DurationVar(&options.EdgeIdentityEnrollmentDuration, optionEdgeIdentityEnrollmentDuration, edge.DefaultEdgeEnrollmentDuration, "the edge identity enrollment duration, use 0h0m0s format")
cmd.Flags().DurationVar(&options.EdgeRouterEnrollmentDuration, optionEdgeRouterEnrollmentDuration, edge.DefaultEdgeEnrollmentDuration, "the edge router enrollment duration, use 0h0m0s format")
+ cmd.Flags().IntVar(&options.MinCluster, optionMinCluster, 0, "minimum cluster size. Enables HA mode if > 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/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
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/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/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)
diff --git a/zititest/go.mod b/zititest/go.mod
index b35f417cb..ec19d3fe1 100644
--- a/zititest/go.mod
+++ b/zititest/go.mod
@@ -7,20 +7,20 @@ 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.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.12
+ 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.37
- github.com/openziti/identity v1.0.70
- 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/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
@@ -28,8 +28,8 @@ require (
github.com/spf13/cobra v1.8.0
github.com/stretchr/testify v1.9.0
go.etcd.io/bbolt v1.3.9
- golang.org/x/net v0.21.0
- google.golang.org/protobuf v1.32.0
+ golang.org/x/net v0.22.0
+ google.golang.org/protobuf v1.33.0
gopkg.in/yaml.v2 v2.4.0
)
@@ -65,28 +65,28 @@ 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
- github.com/go-openapi/analysis v0.22.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.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/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.22.9 // indirect
- github.com/go-openapi/validate v0.23.0 // indirect
- github.com/go-resty/resty/v2 v2.11.0 // indirect
- github.com/golang-jwt/jwt/v5 v5.2.0 // indirect
- github.com/golang/protobuf v1.5.3 // 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.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
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
@@ -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
@@ -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
@@ -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/runzmd v1.0.38 // indirect
- github.com/openziti/secretstream v0.1.16 // 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
github.com/openziti/ziti-db-explorer v1.1.3 // 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
@@ -168,8 +168,8 @@ 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
@@ -186,15 +186,15 @@ require (
go.uber.org/multierr v1.9.0 // indirect
go4.org v0.0.0-20180809161055-417644f6feb5 // indirect
golang.org/x/crypto v0.21.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/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.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 dddafba1a..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=
@@ -223,35 +223,35 @@ 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.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.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q=
-github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs=
-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/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/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/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do=
-github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw=
+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.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/validate v0.23.0 h1:2l7PJLzCis4YUGEoW6eoQw3WhyM65WSIcjX6SQnlfDw=
-github.com/go-openapi/validate v0.23.0/go.mod h1:EeiAZ5bmpSIOJV1WLfyYF9qp/B1ZgSaEpHTJHtN5cbE=
-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-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.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=
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=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -286,8 +286,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=
@@ -312,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=
@@ -339,10 +341,10 @@ 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/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/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.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=
@@ -409,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=
@@ -470,8 +472,8 @@ 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=
github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
@@ -586,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.119 h1:stfSrnDqoTi78LMvQA3+NSivHjQnRrYKrgij5NaOENI=
-github.com/openziti/channel/v2 v2.0.119/go.mod h1:lSRJwqmbkE34DgXYEmUhVCzwcQcx65vZGE8nuBNK458=
+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.12 h1:5VRz0cWtfQq2rhSA7Ne6amM7YNI6pQGRfNgbKt0g6kQ=
-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.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.45 h1:+3zqszLWyFdTgzbsQD90V0yJcC9Ek77qKaIGMQXkAXs=
-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.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=
-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/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.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=
@@ -644,8 +646,8 @@ 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=
github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
@@ -793,10 +795,12 @@ 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/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
+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/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=
@@ -846,8 +850,8 @@ 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.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/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=
@@ -884,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=
@@ -898,8 +901,8 @@ 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=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
@@ -932,8 +935,8 @@ 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=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -985,9 +988,9 @@ 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 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=
@@ -1002,8 +1005,8 @@ 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=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -1098,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=
@@ -1107,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=
@@ -1123,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=
@@ -1190,8 +1189,8 @@ 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=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1312,8 +1311,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/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/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
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 {
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
}