diff --git a/common/pb/edge_cmd_pb/edge_cmd.pb.go b/common/pb/edge_cmd_pb/edge_cmd.pb.go index e160db530..bd4d63fd2 100644 --- a/common/pb/edge_cmd_pb/edge_cmd.pb.go +++ b/common/pb/edge_cmd_pb/edge_cmd.pb.go @@ -2345,6 +2345,69 @@ func (x *Mfa) GetRecoveryCodes() []string { return nil } +type ControllerSetting struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Tags map[string]*TagValue `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Oidc *ControllerSetting_Oidc `protobuf:"bytes,3,opt,name=oidc,proto3" json:"oidc,omitempty"` +} + +func (x *ControllerSetting) Reset() { + *x = ControllerSetting{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_cmd_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ControllerSetting) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ControllerSetting) ProtoMessage() {} + +func (x *ControllerSetting) ProtoReflect() protoreflect.Message { + mi := &file_edge_cmd_proto_msgTypes[24] + 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 ControllerSetting.ProtoReflect.Descriptor instead. +func (*ControllerSetting) Descriptor() ([]byte, []int) { + return file_edge_cmd_proto_rawDescGZIP(), []int{24} +} + +func (x *ControllerSetting) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *ControllerSetting) GetTags() map[string]*TagValue { + if x != nil { + return x.Tags + } + return nil +} + +func (x *ControllerSetting) GetOidc() *ControllerSetting_Oidc { + if x != nil { + return x.Oidc + } + return nil +} + type PostureCheck struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2370,7 +2433,7 @@ type PostureCheck struct { func (x *PostureCheck) Reset() { *x = PostureCheck{} 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) } @@ -2383,7 +2446,7 @@ func (x *PostureCheck) String() string { func (*PostureCheck) ProtoMessage() {} func (x *PostureCheck) 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 { @@ -2396,7 +2459,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{24} + return file_edge_cmd_proto_rawDescGZIP(), []int{25} } func (x *PostureCheck) GetId() string { @@ -2543,7 +2606,7 @@ type Revocation struct { func (x *Revocation) Reset() { *x = Revocation{} 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) } @@ -2556,7 +2619,7 @@ func (x *Revocation) String() string { func (*Revocation) ProtoMessage() {} func (x *Revocation) 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 { @@ -2569,7 +2632,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{25} + return file_edge_cmd_proto_rawDescGZIP(), []int{26} } func (x *Revocation) GetId() string { @@ -2612,7 +2675,7 @@ type Service struct { func (x *Service) Reset() { *x = Service{} 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) } @@ -2625,7 +2688,7 @@ func (x *Service) String() string { func (*Service) ProtoMessage() {} func (x *Service) 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 { @@ -2638,7 +2701,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{26} + return file_edge_cmd_proto_rawDescGZIP(), []int{27} } func (x *Service) GetId() string { @@ -2714,7 +2777,7 @@ type ServiceEdgeRouterPolicy struct { func (x *ServiceEdgeRouterPolicy) Reset() { *x = ServiceEdgeRouterPolicy{} 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) } @@ -2727,7 +2790,7 @@ func (x *ServiceEdgeRouterPolicy) String() string { func (*ServiceEdgeRouterPolicy) ProtoMessage() {} func (x *ServiceEdgeRouterPolicy) 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 { @@ -2740,7 +2803,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{27} + return file_edge_cmd_proto_rawDescGZIP(), []int{28} } func (x *ServiceEdgeRouterPolicy) GetId() string { @@ -2804,7 +2867,7 @@ type ServicePolicy struct { func (x *ServicePolicy) Reset() { *x = ServicePolicy{} 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) } @@ -2817,7 +2880,7 @@ func (x *ServicePolicy) String() string { func (*ServicePolicy) ProtoMessage() {} func (x *ServicePolicy) 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 { @@ -2830,7 +2893,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{28} + return file_edge_cmd_proto_rawDescGZIP(), []int{29} } func (x *ServicePolicy) GetId() string { @@ -2910,7 +2973,7 @@ type TransitRouter struct { func (x *TransitRouter) Reset() { *x = TransitRouter{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[29] + mi := &file_edge_cmd_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2923,7 +2986,7 @@ func (x *TransitRouter) String() string { func (*TransitRouter) ProtoMessage() {} func (x *TransitRouter) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[29] + mi := &file_edge_cmd_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2936,7 +2999,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{29} + return file_edge_cmd_proto_rawDescGZIP(), []int{30} } func (x *TransitRouter) GetId() string { @@ -3022,7 +3085,7 @@ type CreateTransitRouterCmd struct { func (x *CreateTransitRouterCmd) Reset() { *x = CreateTransitRouterCmd{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[30] + mi := &file_edge_cmd_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3035,7 +3098,7 @@ func (x *CreateTransitRouterCmd) String() string { func (*CreateTransitRouterCmd) ProtoMessage() {} func (x *CreateTransitRouterCmd) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[30] + mi := &file_edge_cmd_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3048,7 +3111,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{30} + return file_edge_cmd_proto_rawDescGZIP(), []int{31} } func (x *CreateTransitRouterCmd) GetRouter() *TransitRouter { @@ -3086,7 +3149,7 @@ type UpdateServiceConfigsCmd struct { func (x *UpdateServiceConfigsCmd) Reset() { *x = UpdateServiceConfigsCmd{} 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) } @@ -3099,7 +3162,7 @@ func (x *UpdateServiceConfigsCmd) String() string { func (*UpdateServiceConfigsCmd) ProtoMessage() {} func (x *UpdateServiceConfigsCmd) 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 { @@ -3112,7 +3175,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{31} + return file_edge_cmd_proto_rawDescGZIP(), []int{32} } func (x *UpdateServiceConfigsCmd) GetIdentityId() string { @@ -3158,7 +3221,7 @@ type Authenticator_Cert struct { func (x *Authenticator_Cert) Reset() { *x = Authenticator_Cert{} 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) } @@ -3171,7 +3234,7 @@ func (x *Authenticator_Cert) String() string { func (*Authenticator_Cert) ProtoMessage() {} func (x *Authenticator_Cert) 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 { @@ -3235,7 +3298,7 @@ type Authenticator_Updb struct { func (x *Authenticator_Updb) Reset() { *x = Authenticator_Updb{} 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) } @@ -3248,7 +3311,7 @@ func (x *Authenticator_Updb) String() string { func (*Authenticator_Updb) ProtoMessage() {} func (x *Authenticator_Updb) 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 { @@ -3298,7 +3361,7 @@ type AuthPolicy_Primary struct { func (x *AuthPolicy_Primary) Reset() { *x = AuthPolicy_Primary{} 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) } @@ -3311,7 +3374,7 @@ func (x *AuthPolicy_Primary) String() string { func (*AuthPolicy_Primary) ProtoMessage() {} func (x *AuthPolicy_Primary) 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 { @@ -3360,7 +3423,7 @@ type AuthPolicy_Secondary struct { func (x *AuthPolicy_Secondary) Reset() { *x = AuthPolicy_Secondary{} 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) } @@ -3373,7 +3436,7 @@ func (x *AuthPolicy_Secondary) String() string { func (*AuthPolicy_Secondary) ProtoMessage() {} func (x *AuthPolicy_Secondary) 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 { @@ -3415,7 +3478,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[40] + mi := &file_edge_cmd_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3428,7 +3491,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[40] + mi := &file_edge_cmd_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3475,7 +3538,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[41] + mi := &file_edge_cmd_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3488,7 +3551,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[41] + mi := &file_edge_cmd_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3566,7 +3629,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[42] + mi := &file_edge_cmd_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3579,7 +3642,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[42] + mi := &file_edge_cmd_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3632,7 +3695,7 @@ type Ca_ExternalIdClaim struct { func (x *Ca_ExternalIdClaim) Reset() { *x = Ca_ExternalIdClaim{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[43] + mi := &file_edge_cmd_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3645,7 +3708,7 @@ func (x *Ca_ExternalIdClaim) String() string { func (*Ca_ExternalIdClaim) ProtoMessage() {} func (x *Ca_ExternalIdClaim) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[43] + mi := &file_edge_cmd_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3719,7 +3782,7 @@ type Identity_EnvInfo struct { func (x *Identity_EnvInfo) Reset() { *x = Identity_EnvInfo{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[53] + mi := &file_edge_cmd_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3732,7 +3795,7 @@ func (x *Identity_EnvInfo) String() string { func (*Identity_EnvInfo) ProtoMessage() {} func (x *Identity_EnvInfo) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[53] + mi := &file_edge_cmd_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3806,7 +3869,7 @@ type Identity_SdkInfo struct { func (x *Identity_SdkInfo) Reset() { *x = Identity_SdkInfo{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[54] + mi := &file_edge_cmd_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3819,7 +3882,7 @@ func (x *Identity_SdkInfo) String() string { func (*Identity_SdkInfo) ProtoMessage() {} func (x *Identity_SdkInfo) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[54] + mi := &file_edge_cmd_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3890,7 +3953,7 @@ type Identity_ServiceConfig struct { func (x *Identity_ServiceConfig) Reset() { *x = Identity_ServiceConfig{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[55] + mi := &file_edge_cmd_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3903,7 +3966,7 @@ func (x *Identity_ServiceConfig) String() string { func (*Identity_ServiceConfig) ProtoMessage() {} func (x *Identity_ServiceConfig) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[55] + mi := &file_edge_cmd_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3940,6 +4003,61 @@ func (x *Identity_ServiceConfig) GetConfigId() string { return "" } +type ControllerSetting_Oidc struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RedirectUri []string `protobuf:"bytes,1,rep,name=redirectUri,proto3" json:"redirectUri,omitempty"` + PostLogoutUri []string `protobuf:"bytes,2,rep,name=postLogoutUri,proto3" json:"postLogoutUri,omitempty"` +} + +func (x *ControllerSetting_Oidc) Reset() { + *x = ControllerSetting_Oidc{} + if protoimpl.UnsafeEnabled { + mi := &file_edge_cmd_proto_msgTypes[62] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ControllerSetting_Oidc) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ControllerSetting_Oidc) ProtoMessage() {} + +func (x *ControllerSetting_Oidc) ProtoReflect() protoreflect.Message { + mi := &file_edge_cmd_proto_msgTypes[62] + 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 ControllerSetting_Oidc.ProtoReflect.Descriptor instead. +func (*ControllerSetting_Oidc) Descriptor() ([]byte, []int) { + return file_edge_cmd_proto_rawDescGZIP(), []int{24, 1} +} + +func (x *ControllerSetting_Oidc) GetRedirectUri() []string { + if x != nil { + return x.RedirectUri + } + return nil +} + +func (x *ControllerSetting_Oidc) GetPostLogoutUri() []string { + if x != nil { + return x.PostLogoutUri + } + return nil +} + type PostureCheck_Mac struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3951,7 +4069,7 @@ type PostureCheck_Mac struct { func (x *PostureCheck_Mac) Reset() { *x = PostureCheck_Mac{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[60] + mi := &file_edge_cmd_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3964,7 +4082,7 @@ func (x *PostureCheck_Mac) String() string { func (*PostureCheck_Mac) ProtoMessage() {} func (x *PostureCheck_Mac) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[60] + mi := &file_edge_cmd_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3977,7 +4095,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{24, 0} + return file_edge_cmd_proto_rawDescGZIP(), []int{25, 0} } func (x *PostureCheck_Mac) GetMacAddresses() []string { @@ -4001,7 +4119,7 @@ type PostureCheck_Mfa struct { func (x *PostureCheck_Mfa) Reset() { *x = PostureCheck_Mfa{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[61] + mi := &file_edge_cmd_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4014,7 +4132,7 @@ func (x *PostureCheck_Mfa) String() string { func (*PostureCheck_Mfa) ProtoMessage() {} func (x *PostureCheck_Mfa) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[61] + mi := &file_edge_cmd_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4027,7 +4145,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{24, 1} + return file_edge_cmd_proto_rawDescGZIP(), []int{25, 1} } func (x *PostureCheck_Mfa) GetTimeoutSeconds() int64 { @@ -4070,7 +4188,7 @@ type PostureCheck_Os struct { func (x *PostureCheck_Os) Reset() { *x = PostureCheck_Os{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[62] + mi := &file_edge_cmd_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4083,7 +4201,7 @@ func (x *PostureCheck_Os) String() string { func (*PostureCheck_Os) ProtoMessage() {} func (x *PostureCheck_Os) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[62] + mi := &file_edge_cmd_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4096,7 +4214,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{24, 2} + return file_edge_cmd_proto_rawDescGZIP(), []int{25, 2} } func (x *PostureCheck_Os) GetOsType() string { @@ -4124,7 +4242,7 @@ type PostureCheck_OsList struct { func (x *PostureCheck_OsList) Reset() { *x = PostureCheck_OsList{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[63] + mi := &file_edge_cmd_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4137,7 +4255,7 @@ func (x *PostureCheck_OsList) String() string { func (*PostureCheck_OsList) ProtoMessage() {} func (x *PostureCheck_OsList) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[63] + mi := &file_edge_cmd_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4150,7 +4268,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{24, 3} + return file_edge_cmd_proto_rawDescGZIP(), []int{25, 3} } func (x *PostureCheck_OsList) GetOsList() []*PostureCheck_Os { @@ -4174,7 +4292,7 @@ type PostureCheck_Process struct { func (x *PostureCheck_Process) Reset() { *x = PostureCheck_Process{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[64] + mi := &file_edge_cmd_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4187,7 +4305,7 @@ func (x *PostureCheck_Process) String() string { func (*PostureCheck_Process) ProtoMessage() {} func (x *PostureCheck_Process) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[64] + mi := &file_edge_cmd_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4200,7 +4318,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{24, 4} + return file_edge_cmd_proto_rawDescGZIP(), []int{25, 4} } func (x *PostureCheck_Process) GetOsType() string { @@ -4243,7 +4361,7 @@ type PostureCheck_ProcessMulti struct { func (x *PostureCheck_ProcessMulti) Reset() { *x = PostureCheck_ProcessMulti{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[65] + mi := &file_edge_cmd_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4256,7 +4374,7 @@ func (x *PostureCheck_ProcessMulti) String() string { func (*PostureCheck_ProcessMulti) ProtoMessage() {} func (x *PostureCheck_ProcessMulti) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[65] + mi := &file_edge_cmd_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4269,7 +4387,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{24, 5} + return file_edge_cmd_proto_rawDescGZIP(), []int{25, 5} } func (x *PostureCheck_ProcessMulti) GetSemantic() string { @@ -4297,7 +4415,7 @@ type PostureCheck_Domains struct { func (x *PostureCheck_Domains) Reset() { *x = PostureCheck_Domains{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[66] + mi := &file_edge_cmd_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4310,7 +4428,7 @@ func (x *PostureCheck_Domains) String() string { func (*PostureCheck_Domains) ProtoMessage() {} func (x *PostureCheck_Domains) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[66] + mi := &file_edge_cmd_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4323,7 +4441,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{24, 6} + return file_edge_cmd_proto_rawDescGZIP(), []int{25, 6} } func (x *PostureCheck_Domains) GetDomains() []string { @@ -4345,7 +4463,7 @@ type UpdateServiceConfigsCmd_ServiceConfig struct { func (x *UpdateServiceConfigsCmd_ServiceConfig) Reset() { *x = UpdateServiceConfigsCmd_ServiceConfig{} if protoimpl.UnsafeEnabled { - mi := &file_edge_cmd_proto_msgTypes[73] + mi := &file_edge_cmd_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4358,7 +4476,7 @@ func (x *UpdateServiceConfigsCmd_ServiceConfig) String() string { func (*UpdateServiceConfigsCmd_ServiceConfig) ProtoMessage() {} func (x *UpdateServiceConfigsCmd_ServiceConfig) ProtoReflect() protoreflect.Message { - mi := &file_edge_cmd_proto_msgTypes[73] + mi := &file_edge_cmd_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4371,7 +4489,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{31, 0} + return file_edge_cmd_proto_rawDescGZIP(), []int{32, 0} } func (x *UpdateServiceConfigsCmd_ServiceConfig) GetServiceId() string { @@ -5031,256 +5149,277 @@ var file_edge_cmd_proto_rawDesc = []byte{ 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, 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, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x02, 0x0a, 0x11, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x41, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2d, 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, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, + 0x74, 0x61, 0x67, 0x73, 0x12, 0x3c, 0x0a, 0x04, 0x6f, 0x69, 0x64, 0x63, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x28, 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, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x4f, 0x69, 0x64, 0x63, 0x52, 0x04, 0x6f, 0x69, + 0x64, 0x63, 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, 0x4e, 0x0a, 0x04, 0x4f, 0x69, 0x64, 0x63, 0x12, + 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x55, 0x72, 0x69, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x55, 0x72, + 0x69, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x6f, 0x73, 0x74, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x55, + 0x72, 0x69, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x6f, 0x73, 0x74, 0x4c, 0x6f, + 0x67, 0x6f, 0x75, 0x74, 0x55, 0x72, 0x69, 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, 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, + 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, 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, + 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, 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, + 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, 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, + 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, - 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, 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, + 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, 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, - 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, + 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 ( @@ -5296,7 +5435,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, 74) +var file_edge_cmd_proto_msgTypes = make([]protoimpl.MessageInfo, 77) var file_edge_cmd_proto_goTypes = []interface{}{ (CommandType)(0), // 0: ziti.edge_cmd.pb.CommandType (*ChangeContext)(nil), // 1: ziti.edge_cmd.pb.ChangeContext @@ -5323,153 +5462,159 @@ var file_edge_cmd_proto_goTypes = []interface{}{ (*Identity)(nil), // 22: ziti.edge_cmd.pb.Identity (*CreateIdentityWithEnrollmentsCmd)(nil), // 23: ziti.edge_cmd.pb.CreateIdentityWithEnrollmentsCmd (*Mfa)(nil), // 24: ziti.edge_cmd.pb.Mfa - (*PostureCheck)(nil), // 25: ziti.edge_cmd.pb.PostureCheck - (*Revocation)(nil), // 26: ziti.edge_cmd.pb.Revocation - (*Service)(nil), // 27: ziti.edge_cmd.pb.Service - (*ServiceEdgeRouterPolicy)(nil), // 28: ziti.edge_cmd.pb.ServiceEdgeRouterPolicy - (*ServicePolicy)(nil), // 29: ziti.edge_cmd.pb.ServicePolicy - (*TransitRouter)(nil), // 30: ziti.edge_cmd.pb.TransitRouter - (*CreateTransitRouterCmd)(nil), // 31: ziti.edge_cmd.pb.CreateTransitRouterCmd - (*UpdateServiceConfigsCmd)(nil), // 32: ziti.edge_cmd.pb.UpdateServiceConfigsCmd - nil, // 33: ziti.edge_cmd.pb.ChangeContext.AttributesEntry - nil, // 34: ziti.edge_cmd.pb.JsonMap.ValueEntry - (*Authenticator_Cert)(nil), // 35: ziti.edge_cmd.pb.Authenticator.Cert - (*Authenticator_Updb)(nil), // 36: ziti.edge_cmd.pb.Authenticator.Updb - nil, // 37: ziti.edge_cmd.pb.Authenticator.TagsEntry - (*AuthPolicy_Primary)(nil), // 38: ziti.edge_cmd.pb.AuthPolicy.Primary - (*AuthPolicy_Secondary)(nil), // 39: ziti.edge_cmd.pb.AuthPolicy.Secondary - nil, // 40: ziti.edge_cmd.pb.AuthPolicy.TagsEntry - (*AuthPolicy_Primary_Cert)(nil), // 41: ziti.edge_cmd.pb.AuthPolicy.Primary.Cert - (*AuthPolicy_Primary_Updb)(nil), // 42: ziti.edge_cmd.pb.AuthPolicy.Primary.Updb - (*AuthPolicy_Primary_ExtJwt)(nil), // 43: ziti.edge_cmd.pb.AuthPolicy.Primary.ExtJwt - (*Ca_ExternalIdClaim)(nil), // 44: ziti.edge_cmd.pb.Ca.ExternalIdClaim - nil, // 45: ziti.edge_cmd.pb.Ca.TagsEntry - nil, // 46: ziti.edge_cmd.pb.Config.TagsEntry - nil, // 47: ziti.edge_cmd.pb.ConfigType.TagsEntry - nil, // 48: ziti.edge_cmd.pb.Controller.TagsEntry - nil, // 49: ziti.edge_cmd.pb.Controller.ApiAddressesEntry - nil, // 50: ziti.edge_cmd.pb.EdgeRouter.TagsEntry - nil, // 51: ziti.edge_cmd.pb.EdgeRouterPolicy.TagsEntry - nil, // 52: ziti.edge_cmd.pb.Enrollment.TagsEntry - nil, // 53: ziti.edge_cmd.pb.ExternalJwtSigner.TagsEntry - (*Identity_EnvInfo)(nil), // 54: ziti.edge_cmd.pb.Identity.EnvInfo - (*Identity_SdkInfo)(nil), // 55: ziti.edge_cmd.pb.Identity.SdkInfo - (*Identity_ServiceConfig)(nil), // 56: ziti.edge_cmd.pb.Identity.ServiceConfig - nil, // 57: ziti.edge_cmd.pb.Identity.TagsEntry - nil, // 58: ziti.edge_cmd.pb.Identity.ServiceHostingPrecedencesEntry - nil, // 59: ziti.edge_cmd.pb.Identity.ServiceHostingCostsEntry - nil, // 60: ziti.edge_cmd.pb.Mfa.TagsEntry - (*PostureCheck_Mac)(nil), // 61: ziti.edge_cmd.pb.PostureCheck.Mac - (*PostureCheck_Mfa)(nil), // 62: ziti.edge_cmd.pb.PostureCheck.Mfa - (*PostureCheck_Os)(nil), // 63: ziti.edge_cmd.pb.PostureCheck.Os - (*PostureCheck_OsList)(nil), // 64: ziti.edge_cmd.pb.PostureCheck.OsList - (*PostureCheck_Process)(nil), // 65: ziti.edge_cmd.pb.PostureCheck.Process - (*PostureCheck_ProcessMulti)(nil), // 66: ziti.edge_cmd.pb.PostureCheck.ProcessMulti - (*PostureCheck_Domains)(nil), // 67: ziti.edge_cmd.pb.PostureCheck.Domains - nil, // 68: ziti.edge_cmd.pb.PostureCheck.TagsEntry - nil, // 69: ziti.edge_cmd.pb.Revocation.TagsEntry - nil, // 70: ziti.edge_cmd.pb.Service.TagsEntry - nil, // 71: ziti.edge_cmd.pb.ServiceEdgeRouterPolicy.TagsEntry - nil, // 72: ziti.edge_cmd.pb.ServicePolicy.TagsEntry - nil, // 73: ziti.edge_cmd.pb.TransitRouter.TagsEntry - (*UpdateServiceConfigsCmd_ServiceConfig)(nil), // 74: ziti.edge_cmd.pb.UpdateServiceConfigsCmd.ServiceConfig - (*timestamppb.Timestamp)(nil), // 75: google.protobuf.Timestamp + (*ControllerSetting)(nil), // 25: ziti.edge_cmd.pb.ControllerSetting + (*PostureCheck)(nil), // 26: ziti.edge_cmd.pb.PostureCheck + (*Revocation)(nil), // 27: ziti.edge_cmd.pb.Revocation + (*Service)(nil), // 28: ziti.edge_cmd.pb.Service + (*ServiceEdgeRouterPolicy)(nil), // 29: ziti.edge_cmd.pb.ServiceEdgeRouterPolicy + (*ServicePolicy)(nil), // 30: ziti.edge_cmd.pb.ServicePolicy + (*TransitRouter)(nil), // 31: ziti.edge_cmd.pb.TransitRouter + (*CreateTransitRouterCmd)(nil), // 32: ziti.edge_cmd.pb.CreateTransitRouterCmd + (*UpdateServiceConfigsCmd)(nil), // 33: ziti.edge_cmd.pb.UpdateServiceConfigsCmd + nil, // 34: ziti.edge_cmd.pb.ChangeContext.AttributesEntry + nil, // 35: ziti.edge_cmd.pb.JsonMap.ValueEntry + (*Authenticator_Cert)(nil), // 36: ziti.edge_cmd.pb.Authenticator.Cert + (*Authenticator_Updb)(nil), // 37: ziti.edge_cmd.pb.Authenticator.Updb + nil, // 38: ziti.edge_cmd.pb.Authenticator.TagsEntry + (*AuthPolicy_Primary)(nil), // 39: ziti.edge_cmd.pb.AuthPolicy.Primary + (*AuthPolicy_Secondary)(nil), // 40: ziti.edge_cmd.pb.AuthPolicy.Secondary + nil, // 41: ziti.edge_cmd.pb.AuthPolicy.TagsEntry + (*AuthPolicy_Primary_Cert)(nil), // 42: ziti.edge_cmd.pb.AuthPolicy.Primary.Cert + (*AuthPolicy_Primary_Updb)(nil), // 43: ziti.edge_cmd.pb.AuthPolicy.Primary.Updb + (*AuthPolicy_Primary_ExtJwt)(nil), // 44: ziti.edge_cmd.pb.AuthPolicy.Primary.ExtJwt + (*Ca_ExternalIdClaim)(nil), // 45: ziti.edge_cmd.pb.Ca.ExternalIdClaim + nil, // 46: ziti.edge_cmd.pb.Ca.TagsEntry + nil, // 47: ziti.edge_cmd.pb.Config.TagsEntry + nil, // 48: ziti.edge_cmd.pb.ConfigType.TagsEntry + nil, // 49: ziti.edge_cmd.pb.Controller.TagsEntry + nil, // 50: ziti.edge_cmd.pb.Controller.ApiAddressesEntry + nil, // 51: ziti.edge_cmd.pb.EdgeRouter.TagsEntry + nil, // 52: ziti.edge_cmd.pb.EdgeRouterPolicy.TagsEntry + nil, // 53: ziti.edge_cmd.pb.Enrollment.TagsEntry + nil, // 54: ziti.edge_cmd.pb.ExternalJwtSigner.TagsEntry + (*Identity_EnvInfo)(nil), // 55: ziti.edge_cmd.pb.Identity.EnvInfo + (*Identity_SdkInfo)(nil), // 56: ziti.edge_cmd.pb.Identity.SdkInfo + (*Identity_ServiceConfig)(nil), // 57: ziti.edge_cmd.pb.Identity.ServiceConfig + nil, // 58: ziti.edge_cmd.pb.Identity.TagsEntry + nil, // 59: ziti.edge_cmd.pb.Identity.ServiceHostingPrecedencesEntry + nil, // 60: ziti.edge_cmd.pb.Identity.ServiceHostingCostsEntry + nil, // 61: ziti.edge_cmd.pb.Mfa.TagsEntry + nil, // 62: ziti.edge_cmd.pb.ControllerSetting.TagsEntry + (*ControllerSetting_Oidc)(nil), // 63: ziti.edge_cmd.pb.ControllerSetting.Oidc + (*PostureCheck_Mac)(nil), // 64: ziti.edge_cmd.pb.PostureCheck.Mac + (*PostureCheck_Mfa)(nil), // 65: ziti.edge_cmd.pb.PostureCheck.Mfa + (*PostureCheck_Os)(nil), // 66: ziti.edge_cmd.pb.PostureCheck.Os + (*PostureCheck_OsList)(nil), // 67: ziti.edge_cmd.pb.PostureCheck.OsList + (*PostureCheck_Process)(nil), // 68: ziti.edge_cmd.pb.PostureCheck.Process + (*PostureCheck_ProcessMulti)(nil), // 69: ziti.edge_cmd.pb.PostureCheck.ProcessMulti + (*PostureCheck_Domains)(nil), // 70: ziti.edge_cmd.pb.PostureCheck.Domains + nil, // 71: ziti.edge_cmd.pb.PostureCheck.TagsEntry + nil, // 72: ziti.edge_cmd.pb.Revocation.TagsEntry + nil, // 73: ziti.edge_cmd.pb.Service.TagsEntry + nil, // 74: ziti.edge_cmd.pb.ServiceEdgeRouterPolicy.TagsEntry + nil, // 75: ziti.edge_cmd.pb.ServicePolicy.TagsEntry + nil, // 76: ziti.edge_cmd.pb.TransitRouter.TagsEntry + (*UpdateServiceConfigsCmd_ServiceConfig)(nil), // 77: ziti.edge_cmd.pb.UpdateServiceConfigsCmd.ServiceConfig + (*timestamppb.Timestamp)(nil), // 78: google.protobuf.Timestamp } var file_edge_cmd_proto_depIdxs = []int32{ - 33, // 0: ziti.edge_cmd.pb.ChangeContext.attributes:type_name -> ziti.edge_cmd.pb.ChangeContext.AttributesEntry + 34, // 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 - 34, // 2: ziti.edge_cmd.pb.JsonMap.value:type_name -> ziti.edge_cmd.pb.JsonMap.ValueEntry + 35, // 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 - 37, // 6: ziti.edge_cmd.pb.Authenticator.tags:type_name -> ziti.edge_cmd.pb.Authenticator.TagsEntry - 35, // 7: ziti.edge_cmd.pb.Authenticator.cert:type_name -> ziti.edge_cmd.pb.Authenticator.Cert - 36, // 8: ziti.edge_cmd.pb.Authenticator.updb:type_name -> ziti.edge_cmd.pb.Authenticator.Updb - 38, // 9: ziti.edge_cmd.pb.AuthPolicy.primary:type_name -> ziti.edge_cmd.pb.AuthPolicy.Primary - 39, // 10: ziti.edge_cmd.pb.AuthPolicy.secondary:type_name -> ziti.edge_cmd.pb.AuthPolicy.Secondary - 40, // 11: ziti.edge_cmd.pb.AuthPolicy.tags:type_name -> ziti.edge_cmd.pb.AuthPolicy.TagsEntry - 45, // 12: ziti.edge_cmd.pb.Ca.tags:type_name -> ziti.edge_cmd.pb.Ca.TagsEntry - 44, // 13: ziti.edge_cmd.pb.Ca.externalIdClaim:type_name -> ziti.edge_cmd.pb.Ca.ExternalIdClaim - 46, // 14: ziti.edge_cmd.pb.Config.tags:type_name -> ziti.edge_cmd.pb.Config.TagsEntry - 47, // 15: ziti.edge_cmd.pb.ConfigType.tags:type_name -> ziti.edge_cmd.pb.ConfigType.TagsEntry - 75, // 16: ziti.edge_cmd.pb.Controller.lastJoinedAt:type_name -> google.protobuf.Timestamp - 48, // 17: ziti.edge_cmd.pb.Controller.tags:type_name -> ziti.edge_cmd.pb.Controller.TagsEntry - 49, // 18: ziti.edge_cmd.pb.Controller.apiAddresses:type_name -> ziti.edge_cmd.pb.Controller.ApiAddressesEntry + 38, // 6: ziti.edge_cmd.pb.Authenticator.tags:type_name -> ziti.edge_cmd.pb.Authenticator.TagsEntry + 36, // 7: ziti.edge_cmd.pb.Authenticator.cert:type_name -> ziti.edge_cmd.pb.Authenticator.Cert + 37, // 8: ziti.edge_cmd.pb.Authenticator.updb:type_name -> ziti.edge_cmd.pb.Authenticator.Updb + 39, // 9: ziti.edge_cmd.pb.AuthPolicy.primary:type_name -> ziti.edge_cmd.pb.AuthPolicy.Primary + 40, // 10: ziti.edge_cmd.pb.AuthPolicy.secondary:type_name -> ziti.edge_cmd.pb.AuthPolicy.Secondary + 41, // 11: ziti.edge_cmd.pb.AuthPolicy.tags:type_name -> ziti.edge_cmd.pb.AuthPolicy.TagsEntry + 46, // 12: ziti.edge_cmd.pb.Ca.tags:type_name -> ziti.edge_cmd.pb.Ca.TagsEntry + 45, // 13: ziti.edge_cmd.pb.Ca.externalIdClaim:type_name -> ziti.edge_cmd.pb.Ca.ExternalIdClaim + 47, // 14: ziti.edge_cmd.pb.Config.tags:type_name -> ziti.edge_cmd.pb.Config.TagsEntry + 48, // 15: ziti.edge_cmd.pb.ConfigType.tags:type_name -> ziti.edge_cmd.pb.ConfigType.TagsEntry + 78, // 16: ziti.edge_cmd.pb.Controller.lastJoinedAt:type_name -> google.protobuf.Timestamp + 49, // 17: ziti.edge_cmd.pb.Controller.tags:type_name -> ziti.edge_cmd.pb.Controller.TagsEntry + 50, // 18: ziti.edge_cmd.pb.Controller.apiAddresses:type_name -> ziti.edge_cmd.pb.Controller.ApiAddressesEntry 14, // 19: ziti.edge_cmd.pb.ApiAddressList.addresses:type_name -> ziti.edge_cmd.pb.ApiAddress - 50, // 20: ziti.edge_cmd.pb.EdgeRouter.tags:type_name -> ziti.edge_cmd.pb.EdgeRouter.TagsEntry + 51, // 20: ziti.edge_cmd.pb.EdgeRouter.tags:type_name -> ziti.edge_cmd.pb.EdgeRouter.TagsEntry 1, // 21: ziti.edge_cmd.pb.ReEnrollEdgeRouterCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext 15, // 22: ziti.edge_cmd.pb.CreateEdgeRouterCmd.edgeRouter:type_name -> ziti.edge_cmd.pb.EdgeRouter 19, // 23: ziti.edge_cmd.pb.CreateEdgeRouterCmd.enrollment:type_name -> ziti.edge_cmd.pb.Enrollment 1, // 24: ziti.edge_cmd.pb.CreateEdgeRouterCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext - 51, // 25: ziti.edge_cmd.pb.EdgeRouterPolicy.tags:type_name -> ziti.edge_cmd.pb.EdgeRouterPolicy.TagsEntry - 52, // 26: ziti.edge_cmd.pb.Enrollment.tags:type_name -> ziti.edge_cmd.pb.Enrollment.TagsEntry - 75, // 27: ziti.edge_cmd.pb.Enrollment.issuedAt:type_name -> google.protobuf.Timestamp - 75, // 28: ziti.edge_cmd.pb.Enrollment.expiresAt:type_name -> google.protobuf.Timestamp + 52, // 25: ziti.edge_cmd.pb.EdgeRouterPolicy.tags:type_name -> ziti.edge_cmd.pb.EdgeRouterPolicy.TagsEntry + 53, // 26: ziti.edge_cmd.pb.Enrollment.tags:type_name -> ziti.edge_cmd.pb.Enrollment.TagsEntry + 78, // 27: ziti.edge_cmd.pb.Enrollment.issuedAt:type_name -> google.protobuf.Timestamp + 78, // 28: ziti.edge_cmd.pb.Enrollment.expiresAt:type_name -> google.protobuf.Timestamp 7, // 29: ziti.edge_cmd.pb.ReplaceEnrollmentWithAuthenticatorCmd.authenticator:type_name -> ziti.edge_cmd.pb.Authenticator 1, // 30: ziti.edge_cmd.pb.ReplaceEnrollmentWithAuthenticatorCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext - 53, // 31: ziti.edge_cmd.pb.ExternalJwtSigner.tags:type_name -> ziti.edge_cmd.pb.ExternalJwtSigner.TagsEntry - 75, // 32: ziti.edge_cmd.pb.ExternalJwtSigner.notAfter:type_name -> google.protobuf.Timestamp - 75, // 33: ziti.edge_cmd.pb.ExternalJwtSigner.notBefore:type_name -> google.protobuf.Timestamp - 57, // 34: ziti.edge_cmd.pb.Identity.tags:type_name -> ziti.edge_cmd.pb.Identity.TagsEntry - 54, // 35: ziti.edge_cmd.pb.Identity.envInfo:type_name -> ziti.edge_cmd.pb.Identity.EnvInfo - 55, // 36: ziti.edge_cmd.pb.Identity.sdkInfo:type_name -> ziti.edge_cmd.pb.Identity.SdkInfo - 58, // 37: ziti.edge_cmd.pb.Identity.serviceHostingPrecedences:type_name -> ziti.edge_cmd.pb.Identity.ServiceHostingPrecedencesEntry - 59, // 38: ziti.edge_cmd.pb.Identity.serviceHostingCosts:type_name -> ziti.edge_cmd.pb.Identity.ServiceHostingCostsEntry - 75, // 39: ziti.edge_cmd.pb.Identity.disabledAt:type_name -> google.protobuf.Timestamp - 75, // 40: ziti.edge_cmd.pb.Identity.disabledUntil:type_name -> google.protobuf.Timestamp - 56, // 41: ziti.edge_cmd.pb.Identity.serviceConfigs:type_name -> ziti.edge_cmd.pb.Identity.ServiceConfig + 54, // 31: ziti.edge_cmd.pb.ExternalJwtSigner.tags:type_name -> ziti.edge_cmd.pb.ExternalJwtSigner.TagsEntry + 78, // 32: ziti.edge_cmd.pb.ExternalJwtSigner.notAfter:type_name -> google.protobuf.Timestamp + 78, // 33: ziti.edge_cmd.pb.ExternalJwtSigner.notBefore:type_name -> google.protobuf.Timestamp + 58, // 34: ziti.edge_cmd.pb.Identity.tags:type_name -> ziti.edge_cmd.pb.Identity.TagsEntry + 55, // 35: ziti.edge_cmd.pb.Identity.envInfo:type_name -> ziti.edge_cmd.pb.Identity.EnvInfo + 56, // 36: ziti.edge_cmd.pb.Identity.sdkInfo:type_name -> ziti.edge_cmd.pb.Identity.SdkInfo + 59, // 37: ziti.edge_cmd.pb.Identity.serviceHostingPrecedences:type_name -> ziti.edge_cmd.pb.Identity.ServiceHostingPrecedencesEntry + 60, // 38: ziti.edge_cmd.pb.Identity.serviceHostingCosts:type_name -> ziti.edge_cmd.pb.Identity.ServiceHostingCostsEntry + 78, // 39: ziti.edge_cmd.pb.Identity.disabledAt:type_name -> google.protobuf.Timestamp + 78, // 40: ziti.edge_cmd.pb.Identity.disabledUntil:type_name -> google.protobuf.Timestamp + 57, // 41: ziti.edge_cmd.pb.Identity.serviceConfigs:type_name -> ziti.edge_cmd.pb.Identity.ServiceConfig 22, // 42: ziti.edge_cmd.pb.CreateIdentityWithEnrollmentsCmd.identity:type_name -> ziti.edge_cmd.pb.Identity 19, // 43: ziti.edge_cmd.pb.CreateIdentityWithEnrollmentsCmd.enrollments:type_name -> ziti.edge_cmd.pb.Enrollment 1, // 44: ziti.edge_cmd.pb.CreateIdentityWithEnrollmentsCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext - 60, // 45: ziti.edge_cmd.pb.Mfa.tags:type_name -> ziti.edge_cmd.pb.Mfa.TagsEntry - 68, // 46: ziti.edge_cmd.pb.PostureCheck.tags:type_name -> ziti.edge_cmd.pb.PostureCheck.TagsEntry - 61, // 47: ziti.edge_cmd.pb.PostureCheck.mac:type_name -> ziti.edge_cmd.pb.PostureCheck.Mac - 62, // 48: ziti.edge_cmd.pb.PostureCheck.mfa:type_name -> ziti.edge_cmd.pb.PostureCheck.Mfa - 64, // 49: ziti.edge_cmd.pb.PostureCheck.osList:type_name -> ziti.edge_cmd.pb.PostureCheck.OsList - 65, // 50: ziti.edge_cmd.pb.PostureCheck.process:type_name -> ziti.edge_cmd.pb.PostureCheck.Process - 66, // 51: ziti.edge_cmd.pb.PostureCheck.processMulti:type_name -> ziti.edge_cmd.pb.PostureCheck.ProcessMulti - 67, // 52: ziti.edge_cmd.pb.PostureCheck.domains:type_name -> ziti.edge_cmd.pb.PostureCheck.Domains - 75, // 53: ziti.edge_cmd.pb.Revocation.expiresAt:type_name -> google.protobuf.Timestamp - 69, // 54: ziti.edge_cmd.pb.Revocation.tags:type_name -> ziti.edge_cmd.pb.Revocation.TagsEntry - 70, // 55: ziti.edge_cmd.pb.Service.tags:type_name -> ziti.edge_cmd.pb.Service.TagsEntry - 71, // 56: ziti.edge_cmd.pb.ServiceEdgeRouterPolicy.tags:type_name -> ziti.edge_cmd.pb.ServiceEdgeRouterPolicy.TagsEntry - 72, // 57: ziti.edge_cmd.pb.ServicePolicy.tags:type_name -> ziti.edge_cmd.pb.ServicePolicy.TagsEntry - 73, // 58: ziti.edge_cmd.pb.TransitRouter.tags:type_name -> ziti.edge_cmd.pb.TransitRouter.TagsEntry - 30, // 59: ziti.edge_cmd.pb.CreateTransitRouterCmd.router:type_name -> ziti.edge_cmd.pb.TransitRouter - 19, // 60: ziti.edge_cmd.pb.CreateTransitRouterCmd.enrollment:type_name -> ziti.edge_cmd.pb.Enrollment - 1, // 61: ziti.edge_cmd.pb.CreateTransitRouterCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext - 74, // 62: ziti.edge_cmd.pb.UpdateServiceConfigsCmd.serviceConfigs:type_name -> ziti.edge_cmd.pb.UpdateServiceConfigsCmd.ServiceConfig - 1, // 63: ziti.edge_cmd.pb.UpdateServiceConfigsCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext - 6, // 64: ziti.edge_cmd.pb.JsonMap.ValueEntry.value:type_name -> ziti.edge_cmd.pb.JsonValue - 3, // 65: ziti.edge_cmd.pb.Authenticator.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 41, // 66: ziti.edge_cmd.pb.AuthPolicy.Primary.cert:type_name -> ziti.edge_cmd.pb.AuthPolicy.Primary.Cert - 42, // 67: ziti.edge_cmd.pb.AuthPolicy.Primary.updb:type_name -> ziti.edge_cmd.pb.AuthPolicy.Primary.Updb - 43, // 68: ziti.edge_cmd.pb.AuthPolicy.Primary.extJwt:type_name -> ziti.edge_cmd.pb.AuthPolicy.Primary.ExtJwt - 3, // 69: ziti.edge_cmd.pb.AuthPolicy.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 70: ziti.edge_cmd.pb.Ca.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 71: ziti.edge_cmd.pb.Config.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 72: ziti.edge_cmd.pb.ConfigType.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 73: ziti.edge_cmd.pb.Controller.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 13, // 74: ziti.edge_cmd.pb.Controller.ApiAddressesEntry.value:type_name -> ziti.edge_cmd.pb.ApiAddressList - 3, // 75: ziti.edge_cmd.pb.EdgeRouter.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 76: ziti.edge_cmd.pb.EdgeRouterPolicy.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 77: ziti.edge_cmd.pb.Enrollment.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 78: ziti.edge_cmd.pb.ExternalJwtSigner.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 79: ziti.edge_cmd.pb.Identity.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 80: ziti.edge_cmd.pb.Mfa.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 63, // 81: ziti.edge_cmd.pb.PostureCheck.OsList.osList:type_name -> ziti.edge_cmd.pb.PostureCheck.Os - 65, // 82: ziti.edge_cmd.pb.PostureCheck.ProcessMulti.processes:type_name -> ziti.edge_cmd.pb.PostureCheck.Process - 3, // 83: ziti.edge_cmd.pb.PostureCheck.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 84: ziti.edge_cmd.pb.Revocation.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 85: ziti.edge_cmd.pb.Service.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 86: ziti.edge_cmd.pb.ServiceEdgeRouterPolicy.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 87: ziti.edge_cmd.pb.ServicePolicy.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 3, // 88: ziti.edge_cmd.pb.TransitRouter.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue - 89, // [89:89] is the sub-list for method output_type - 89, // [89:89] is the sub-list for method input_type - 89, // [89:89] is the sub-list for extension type_name - 89, // [89:89] is the sub-list for extension extendee - 0, // [0:89] is the sub-list for field type_name + 61, // 45: ziti.edge_cmd.pb.Mfa.tags:type_name -> ziti.edge_cmd.pb.Mfa.TagsEntry + 62, // 46: ziti.edge_cmd.pb.ControllerSetting.tags:type_name -> ziti.edge_cmd.pb.ControllerSetting.TagsEntry + 63, // 47: ziti.edge_cmd.pb.ControllerSetting.oidc:type_name -> ziti.edge_cmd.pb.ControllerSetting.Oidc + 71, // 48: ziti.edge_cmd.pb.PostureCheck.tags:type_name -> ziti.edge_cmd.pb.PostureCheck.TagsEntry + 64, // 49: ziti.edge_cmd.pb.PostureCheck.mac:type_name -> ziti.edge_cmd.pb.PostureCheck.Mac + 65, // 50: ziti.edge_cmd.pb.PostureCheck.mfa:type_name -> ziti.edge_cmd.pb.PostureCheck.Mfa + 67, // 51: ziti.edge_cmd.pb.PostureCheck.osList:type_name -> ziti.edge_cmd.pb.PostureCheck.OsList + 68, // 52: ziti.edge_cmd.pb.PostureCheck.process:type_name -> ziti.edge_cmd.pb.PostureCheck.Process + 69, // 53: ziti.edge_cmd.pb.PostureCheck.processMulti:type_name -> ziti.edge_cmd.pb.PostureCheck.ProcessMulti + 70, // 54: ziti.edge_cmd.pb.PostureCheck.domains:type_name -> ziti.edge_cmd.pb.PostureCheck.Domains + 78, // 55: ziti.edge_cmd.pb.Revocation.expiresAt:type_name -> google.protobuf.Timestamp + 72, // 56: ziti.edge_cmd.pb.Revocation.tags:type_name -> ziti.edge_cmd.pb.Revocation.TagsEntry + 73, // 57: ziti.edge_cmd.pb.Service.tags:type_name -> ziti.edge_cmd.pb.Service.TagsEntry + 74, // 58: ziti.edge_cmd.pb.ServiceEdgeRouterPolicy.tags:type_name -> ziti.edge_cmd.pb.ServiceEdgeRouterPolicy.TagsEntry + 75, // 59: ziti.edge_cmd.pb.ServicePolicy.tags:type_name -> ziti.edge_cmd.pb.ServicePolicy.TagsEntry + 76, // 60: ziti.edge_cmd.pb.TransitRouter.tags:type_name -> ziti.edge_cmd.pb.TransitRouter.TagsEntry + 31, // 61: ziti.edge_cmd.pb.CreateTransitRouterCmd.router:type_name -> ziti.edge_cmd.pb.TransitRouter + 19, // 62: ziti.edge_cmd.pb.CreateTransitRouterCmd.enrollment:type_name -> ziti.edge_cmd.pb.Enrollment + 1, // 63: ziti.edge_cmd.pb.CreateTransitRouterCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext + 77, // 64: ziti.edge_cmd.pb.UpdateServiceConfigsCmd.serviceConfigs:type_name -> ziti.edge_cmd.pb.UpdateServiceConfigsCmd.ServiceConfig + 1, // 65: ziti.edge_cmd.pb.UpdateServiceConfigsCmd.ctx:type_name -> ziti.edge_cmd.pb.ChangeContext + 6, // 66: ziti.edge_cmd.pb.JsonMap.ValueEntry.value:type_name -> ziti.edge_cmd.pb.JsonValue + 3, // 67: ziti.edge_cmd.pb.Authenticator.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 42, // 68: ziti.edge_cmd.pb.AuthPolicy.Primary.cert:type_name -> ziti.edge_cmd.pb.AuthPolicy.Primary.Cert + 43, // 69: ziti.edge_cmd.pb.AuthPolicy.Primary.updb:type_name -> ziti.edge_cmd.pb.AuthPolicy.Primary.Updb + 44, // 70: ziti.edge_cmd.pb.AuthPolicy.Primary.extJwt:type_name -> ziti.edge_cmd.pb.AuthPolicy.Primary.ExtJwt + 3, // 71: ziti.edge_cmd.pb.AuthPolicy.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 72: ziti.edge_cmd.pb.Ca.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 73: ziti.edge_cmd.pb.Config.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 74: ziti.edge_cmd.pb.ConfigType.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 75: ziti.edge_cmd.pb.Controller.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 13, // 76: ziti.edge_cmd.pb.Controller.ApiAddressesEntry.value:type_name -> ziti.edge_cmd.pb.ApiAddressList + 3, // 77: ziti.edge_cmd.pb.EdgeRouter.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 78: ziti.edge_cmd.pb.EdgeRouterPolicy.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 79: ziti.edge_cmd.pb.Enrollment.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 80: ziti.edge_cmd.pb.ExternalJwtSigner.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 81: ziti.edge_cmd.pb.Identity.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 82: ziti.edge_cmd.pb.Mfa.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 83: ziti.edge_cmd.pb.ControllerSetting.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 66, // 84: ziti.edge_cmd.pb.PostureCheck.OsList.osList:type_name -> ziti.edge_cmd.pb.PostureCheck.Os + 68, // 85: ziti.edge_cmd.pb.PostureCheck.ProcessMulti.processes:type_name -> ziti.edge_cmd.pb.PostureCheck.Process + 3, // 86: ziti.edge_cmd.pb.PostureCheck.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 87: ziti.edge_cmd.pb.Revocation.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 88: ziti.edge_cmd.pb.Service.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 89: ziti.edge_cmd.pb.ServiceEdgeRouterPolicy.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 90: ziti.edge_cmd.pb.ServicePolicy.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 3, // 91: ziti.edge_cmd.pb.TransitRouter.TagsEntry.value:type_name -> ziti.edge_cmd.pb.TagValue + 92, // [92:92] is the sub-list for method output_type + 92, // [92:92] is the sub-list for method input_type + 92, // [92:92] is the sub-list for extension type_name + 92, // [92:92] is the sub-list for extension extendee + 0, // [0:92] is the sub-list for field type_name } func init() { file_edge_cmd_proto_init() } @@ -5767,7 +5912,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostureCheck); i { + switch v := v.(*ControllerSetting); i { case 0: return &v.state case 1: @@ -5779,7 +5924,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Revocation); i { + switch v := v.(*PostureCheck); i { case 0: return &v.state case 1: @@ -5791,7 +5936,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Service); i { + switch v := v.(*Revocation); i { case 0: return &v.state case 1: @@ -5803,7 +5948,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServiceEdgeRouterPolicy); i { + switch v := v.(*Service); i { case 0: return &v.state case 1: @@ -5815,7 +5960,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServicePolicy); i { + switch v := v.(*ServiceEdgeRouterPolicy); i { case 0: return &v.state case 1: @@ -5827,7 +5972,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransitRouter); i { + switch v := v.(*ServicePolicy); i { case 0: return &v.state case 1: @@ -5839,7 +5984,7 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTransitRouterCmd); i { + switch v := v.(*TransitRouter); i { case 0: return &v.state case 1: @@ -5851,6 +5996,18 @@ func file_edge_cmd_proto_init() { } } file_edge_cmd_proto_msgTypes[31].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[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpdateServiceConfigsCmd); i { case 0: return &v.state @@ -5862,7 +6019,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.(*Authenticator_Cert); i { case 0: return &v.state @@ -5874,7 +6031,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.(*Authenticator_Updb); i { case 0: return &v.state @@ -5886,7 +6043,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); i { case 0: return &v.state @@ -5898,7 +6055,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_Secondary); i { case 0: return &v.state @@ -5910,7 +6067,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.(*AuthPolicy_Primary_Cert); i { case 0: return &v.state @@ -5922,7 +6079,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AuthPolicy_Primary_Updb); i { case 0: return &v.state @@ -5934,7 +6091,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AuthPolicy_Primary_ExtJwt); i { case 0: return &v.state @@ -5946,7 +6103,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Ca_ExternalIdClaim); i { case 0: return &v.state @@ -5958,7 +6115,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Identity_EnvInfo); i { case 0: return &v.state @@ -5970,7 +6127,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[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Identity_SdkInfo); i { case 0: return &v.state @@ -5982,7 +6139,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[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Identity_ServiceConfig); i { case 0: return &v.state @@ -5994,7 +6151,19 @@ 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.(*ControllerSetting_Oidc); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_edge_cmd_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PostureCheck_Mac); i { case 0: return &v.state @@ -6006,7 +6175,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PostureCheck_Mfa); i { case 0: return &v.state @@ -6018,7 +6187,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PostureCheck_Os); i { case 0: return &v.state @@ -6030,7 +6199,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PostureCheck_OsList); i { case 0: return &v.state @@ -6042,7 +6211,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PostureCheck_Process); i { case 0: return &v.state @@ -6054,7 +6223,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PostureCheck_ProcessMulti); i { case 0: return &v.state @@ -6066,7 +6235,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PostureCheck_Domains); i { case 0: return &v.state @@ -6078,7 +6247,7 @@ func file_edge_cmd_proto_init() { return nil } } - file_edge_cmd_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + file_edge_cmd_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpdateServiceConfigsCmd_ServiceConfig); i { case 0: return &v.state @@ -6115,7 +6284,7 @@ func file_edge_cmd_proto_init() { file_edge_cmd_proto_msgTypes[18].OneofWrappers = []interface{}{} file_edge_cmd_proto_msgTypes[20].OneofWrappers = []interface{}{} file_edge_cmd_proto_msgTypes[21].OneofWrappers = []interface{}{} - file_edge_cmd_proto_msgTypes[24].OneofWrappers = []interface{}{ + file_edge_cmd_proto_msgTypes[25].OneofWrappers = []interface{}{ (*PostureCheck_Mac_)(nil), (*PostureCheck_Mfa_)(nil), (*PostureCheck_OsList_)(nil), @@ -6123,15 +6292,15 @@ func file_edge_cmd_proto_init() { (*PostureCheck_ProcessMulti_)(nil), (*PostureCheck_Domains_)(nil), } - file_edge_cmd_proto_msgTypes[29].OneofWrappers = []interface{}{} - file_edge_cmd_proto_msgTypes[38].OneofWrappers = []interface{}{} + file_edge_cmd_proto_msgTypes[30].OneofWrappers = []interface{}{} + file_edge_cmd_proto_msgTypes[39].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: 74, + NumMessages: 77, 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 08bfd29d4..93c9a9c05 100644 --- a/common/pb/edge_cmd_pb/edge_cmd.proto +++ b/common/pb/edge_cmd_pb/edge_cmd.proto @@ -339,6 +339,21 @@ message Mfa { repeated string recoveryCodes = 6; } +// ControllerSetting + +message ControllerSetting { + string id = 1; + map tags = 2; + + message Oidc { + repeated string redirectUri = 1; + repeated string postLogoutUri = 2; + } + + Oidc oidc = 3; + +} + // Posture Checks /* */ diff --git a/controller/db/base_entity.go b/controller/db/base_entity.go index ed1101a42..edfde5996 100644 --- a/controller/db/base_entity.go +++ b/controller/db/base_entity.go @@ -35,6 +35,7 @@ const ( EntityTypeIdentities = "identities" EntityTypeIdentityTypes = "identityTypes" EntityTypeMfas = "mfas" + EntityTypeSettings = "settings" EntityTypeRevocations = "revocations" EntityTypeServicePolicies = "servicePolicies" EntityTypeServiceEdgeRouterPolicies = "serviceEdgeRouterPolicies" diff --git a/controller/db/controller_setting_store.go b/controller/db/controller_setting_store.go new file mode 100644 index 000000000..aee5859f8 --- /dev/null +++ b/controller/db/controller_setting_store.go @@ -0,0 +1,375 @@ +/* + 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 ( + "context" + "errors" + "github.com/michaelquigley/pfxlog" + "github.com/openziti/foundation/v2/errorz" + "github.com/openziti/foundation/v2/stringz" + "github.com/openziti/storage/boltz" + "go.etcd.io/bbolt" + "reflect" +) + +const ( + ControllerSettingGlobalId = "global" + ControllerSettingAny = "any" + + FieldControllerSettingOidc = "oidc" + + FieldControllerSettingOidcRedirectUris = FieldControllerSettingOidc + ".redirectUris" + FieldControllerSettingOidcPostLogoutUris = FieldControllerSettingOidc + ".postLogoutUris" + FieldControllerSettingIsMigration = "isMigration" +) + +type controllerFieldChangeContextKey string + +const controllerFieldChangeContext controllerFieldChangeContextKey = "controllerFieldChangeContext" + +type ControllerSettingDef interface { + Id() string + FillEntity(bucket *boltz.TypedBucket) + PersistEntity(ctx *boltz.PersistContext, bucket *boltz.TypedBucket, entity *ControllerSetting) +} + +type ControllerSetting struct { + boltz.BaseExtEntity + Oidc *OidcSettingDef + + IsMigration bool +} + +func (entity *ControllerSetting) GetEntityType() string { + return EntityTypeSettings +} + +// MergeSettings returns a new setting instance with the global settings overridden by the provided settings +func (entity *ControllerSetting) MergeSettings(setting *ControllerSetting) *ControllerSetting { + newCs := &ControllerSetting{ + BaseExtEntity: setting.BaseExtEntity, + Oidc: entity.Oidc, + } + + if setting.Oidc != nil { + newCs.Oidc = setting.Oidc + } + + return newCs +} + +var _ ControllerSettingStore = (*controllerSettingStoreImpl)(nil) + +type ControllerSettingStore interface { + Store[*ControllerSetting] + Watch(setting string, listener ControllerSettingListener, controllerId string, additionalControllerIds ...string) + CreateGlobalDefault(ctx boltz.MutateContext, settings *ControllerSetting) error +} + +func newControllerSettingStore(provider DbProviderF, stores *stores) *controllerSettingStoreImpl { + store := &controllerSettingStoreImpl{ + dbProvider: provider, + } + store.baseStore = newBaseStore[*ControllerSetting](stores, store) + store.InitImpl(store) + return store +} + +type controllerSettingStoreImpl struct { + *baseStore[*ControllerSetting] + indexName boltz.ReadIndex + symbolEnrollments boltz.EntitySetSymbol + settingControllerListeners map[string]map[string][]ControllerSettingListener //setting path -> controller id -> -> listeners + dbProvider DbProviderF +} + +func (store *controllerSettingStoreImpl) CreateGlobalDefault(ctx boltz.MutateContext, settings *ControllerSetting) error { + settings.Id = ControllerSettingGlobalId + settings.IsSystem = true + + _ = store.DeleteById(ctx, ControllerSettingGlobalId) + + return store.Create(ctx, settings) +} + +func (store *controllerSettingStoreImpl) initializeLocal() { + store.AddExtEntitySymbols() + + store.AddEntityConstraint(&untypedConstraintWithCtx[*ControllerSetting]{ + eventListener: store.onCreateOrUpdate, + changeTypes: []boltz.EntityEventType{boltz.EntityCreated, boltz.EntityUpdated}, + }) + + store.AddListener(store.onDelete, boltz.EntityDeleted) +} + +type untypedConstraintWithCtx[E boltz.Entity] struct { + eventListener func(boltz.MutateContext, boltz.Entity) + changeTypes []boltz.EntityEventType +} + +func (self *untypedConstraintWithCtx[E]) ProcessPreCommit(*boltz.EntityChangeState[E]) error { + return nil +} + +func (self *untypedConstraintWithCtx[E]) ProcessPostCommit(state *boltz.EntityChangeState[E]) { + for _, changeType := range self.changeTypes { + if state.ChangeType == boltz.EntityCreated && changeType.IsCreate() { + if changeType.IsAsync() { + go self.eventListener(state.Ctx, state.FinalState) + } else { + self.eventListener(state.Ctx, state.FinalState) + } + } else if state.ChangeType == boltz.EntityUpdated && changeType.IsUpdate() { + if changeType.IsAsync() { + go self.eventListener(state.Ctx, state.FinalState) + } else { + self.eventListener(state.Ctx, state.FinalState) + } + } else if state.ChangeType == boltz.EntityDeleted && changeType.IsDelete() { + if changeType.IsAsync() { + go self.eventListener(state.Ctx, state.InitialState) + } else { + self.eventListener(state.Ctx, state.InitialState) + } + } + } +} + +func (store *controllerSettingStoreImpl) initializeLinked() {} + +func (store *controllerSettingStoreImpl) NewEntity() *ControllerSetting { + return &ControllerSetting{ + Oidc: &OidcSettingDef{ + RedirectUris: nil, + PostLogoutUris: nil, + }, + } +} + +func (store *controllerSettingStoreImpl) DeleteById(ctx boltz.MutateContext, id string) error { + policy, err := store.LoadById(ctx.Tx(), id) + if err != nil { + return err + } + if !policy.IsSystem || ctx.IsSystemContext() { + return store.BaseStore.DeleteById(ctx, id) + } + return errorz.NewEntityCanNotBeDeletedFrom(errors.New("default settings cannot be removed, only updated")) +} + +type ControllerSettingsEvent struct { + Effective *ControllerSetting + Instance *ControllerSetting + Global *ControllerSetting +} + +type ControllerSettingListener func(setting string, controllerId string, settingEvent *ControllerSettingsEvent) + +func (store *controllerSettingStoreImpl) Watch(setting string, listener ControllerSettingListener, controllerId string, additionalControllerIds ...string) { + + additionalControllerIds = append(additionalControllerIds, controllerId) + + if store.settingControllerListeners == nil { + store.settingControllerListeners = make(map[string]map[string][]ControllerSettingListener) + } + + for _, id := range additionalControllerIds { + if store.settingControllerListeners[setting] == nil { + store.settingControllerListeners[setting] = make(map[string][]ControllerSettingListener) + } + + if store.settingControllerListeners[setting][id] == nil { + store.settingControllerListeners[setting][id] = make([]ControllerSettingListener, 0) + } + + store.settingControllerListeners[setting][id] = append(store.settingControllerListeners[setting][id], listener) + } +} + +func (store *controllerSettingStoreImpl) onDelete(entity boltz.Entity) { + setting := entity.(*ControllerSetting) + + for _, controllerListeners := range store.settingControllerListeners { + delete(controllerListeners, setting.Id) + } +} + +func (store *controllerSettingStoreImpl) onCreateOrUpdate(ctx boltz.MutateContext, entity boltz.Entity) { + setting := entity.(*ControllerSetting) + + changedPaths := getChangedPaths(ctx) + pathMap := make(map[string]struct{}) + + for _, path := range changedPaths { + pathMap[path] = struct{}{} + } + + var globalSettings *ControllerSetting + err := store.dbProvider().View(func(tx *bbolt.Tx) error { + var err error + globalSettings, err = store.GetGlobalSettings(tx) + return err + }) + + if err != nil { + pfxlog.Logger().WithError(err).Errorf("error processing create/update settings changes, could not get global configuration settings") + return + } + + effectiveSettings := globalSettings.MergeSettings(setting) + + eventData := &ControllerSettingsEvent{ + Effective: effectiveSettings, + Instance: setting, + Global: globalSettings, + } + + for path := range pathMap { + settingControllerListeners := store.settingControllerListeners[path] + + for _, controllerListeners := range settingControllerListeners[setting.Id] { + controllerListeners(path, setting.Id, eventData) + } + + for _, controllerListeners := range settingControllerListeners[ControllerSettingAny] { + controllerListeners(path, setting.Id, eventData) + } + } +} + +func (store *controllerSettingStoreImpl) FillEntity(entity *ControllerSetting, bucket *boltz.TypedBucket) { + entity.LoadBaseValues(bucket) + + entityVal := reflect.ValueOf(entity).Elem() + entityType := reflect.TypeOf(entity).Elem() + + for i := 0; i < entityType.NumField(); i++ { + field := entityVal.Field(i) + if field.Kind() == reflect.Ptr && !field.IsNil() { + if field.Type().Implements(reflect.TypeOf((*ControllerSettingDef)(nil)).Elem()) { + // Cast to ControllerSettingDef and call FillEntity() + setting := field.Interface().(ControllerSettingDef) + settingBucketId := setting.Id() + + settingBucket := bucket.GetOrCreateBucket(settingBucketId) + setting.FillEntity(settingBucket) + } + } + } + + entity.IsMigration = bucket.GetBoolWithDefault(FieldControllerSettingIsMigration, false) +} + +func (store *controllerSettingStoreImpl) PersistEntity(entity *ControllerSetting, ctx *boltz.PersistContext) { + entity.SetBaseValues(ctx) + + entityVal := reflect.ValueOf(entity).Elem() + entityType := reflect.TypeOf(entity).Elem() + + for i := 0; i < entityType.NumField(); i++ { + field := entityVal.Field(i) + if field.Kind() == reflect.Ptr && !field.IsNil() { + if field.Type().Implements(reflect.TypeOf((*ControllerSettingDef)(nil)).Elem()) { + // Cast to ControllerSettingDef and call FillEntity() + setting := field.Interface().(ControllerSettingDef) + settingBucketId := setting.Id() + + settingBucket := ctx.Bucket.GetOrCreateBucket(settingBucketId) + setting.PersistEntity(ctx, settingBucket, entity) + } + } + } + + ctx.SetBool(FieldControllerSettingIsMigration, entity.IsMigration) +} + +func (store *controllerSettingStoreImpl) GetGlobalSettings(tx *bbolt.Tx) (*ControllerSetting, error) { + return store.LoadById(tx, ControllerSettingGlobalId) +} + +var _ ControllerSettingDef = (*OidcSettingDef)(nil) + +type OidcSettingDef struct { + RedirectUris []string + PostLogoutUris []string +} + +func (o *OidcSettingDef) Id() string { + return FieldControllerSettingOidc +} + +func (o *OidcSettingDef) FillEntity(bucket *boltz.TypedBucket) { + o.RedirectUris = bucket.GetStringList(FieldControllerSettingOidcRedirectUris) + o.PostLogoutUris = bucket.GetStringList(FieldControllerSettingOidcPostLogoutUris) +} + +func getChangedPaths(ctx boltz.MutateContext) (changedPaths []string) { + v := ctx.Context().Value(controllerFieldChangeContext) + + if v == nil { + return nil + } + + return v.(*PathSet).Paths +} + +type PathSet struct { + Paths []string +} + +func addChangedPath(ctx boltz.MutateContext, newPaths ...string) { + v := ctx.Context().Value(controllerFieldChangeContext) + + var changedPaths *PathSet + + if v == nil { + changedPaths = &PathSet{} + ctx.UpdateContext(func(ctx context.Context) context.Context { + return context.WithValue(ctx, controllerFieldChangeContext, changedPaths) + }) + } else { + changedPaths = v.(*PathSet) + } + + changedPaths.Paths = append(changedPaths.Paths, newPaths...) +} + +func (o *OidcSettingDef) PersistEntity(ctx *boltz.PersistContext, bucket *boltz.TypedBucket, entity *ControllerSetting) { + settingsChanged := false + + if ctx.FieldChecker == nil || ctx.FieldChecker.IsUpdated(FieldControllerSettingOidcRedirectUris) { + if !stringz.EqualSlices(bucket.GetStringList(FieldControllerSettingOidcRedirectUris), o.RedirectUris) { + bucket.SetStringList(FieldControllerSettingOidcRedirectUris, o.RedirectUris, ctx.FieldChecker) + addChangedPath(ctx, FieldControllerSettingOidcRedirectUris) + settingsChanged = true + } + } + + if ctx.FieldChecker == nil || ctx.FieldChecker.IsUpdated(FieldControllerSettingOidcPostLogoutUris) { + if !stringz.EqualSlices(bucket.GetStringList(FieldControllerSettingOidcPostLogoutUris), o.PostLogoutUris) { + bucket.SetStringList(FieldControllerSettingOidcPostLogoutUris, o.PostLogoutUris, ctx.FieldChecker) + addChangedPath(ctx, FieldControllerSettingOidcPostLogoutUris) + settingsChanged = true + } + } + + if settingsChanged { + addChangedPath(ctx, FieldControllerSettingOidc) + } +} diff --git a/controller/db/migration_initialize.go b/controller/db/migration_initialize.go index 61eeaf3e9..22bca3d37 100644 --- a/controller/db/migration_initialize.go +++ b/controller/db/migration_initialize.go @@ -41,6 +41,7 @@ func (m *Migrations) initialize(step *boltz.MigrationStep) int { m.addProcessMultiPostureCheck(step) step.SetError(m.stores.ConfigType.Create(step.Ctx, hostV2ConfigType)) m.addSystemAuthPolicies(step) + m.addGlobalControllerConfig(step) return CurrentDbVersion } diff --git a/controller/db/migration_v38.go b/controller/db/migration_v38.go new file mode 100644 index 000000000..f85a868eb --- /dev/null +++ b/controller/db/migration_v38.go @@ -0,0 +1,58 @@ +/* + 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/boltz" +) + +func (m *Migrations) addGlobalControllerConfig(step *boltz.MigrationStep) { + + redirects := []string{ + "openziti://auth/callback", + "https://127.0.0.1:*/auth/callback", + "http://127.0.0.1:*/auth/callback", + "https://localhost:*/auth/callback", + "http://localhost:*/auth/callback", + "http://[::1]:*/auth/callback", + "https://[::1]:*/auth/callback", + } + + postLogouts := []string{ + "openziti://auth/logout", + "https://127.0.0.1:*/auth/logout", + "http://127.0.0.1:*/auth/logout", + "https://localhost:*/auth/logout", + "http://localhost:*/auth/logout", + "http://[::1]:*/auth/logout", + "https://[::1]:*/auth/logout", + } + + settings := &ControllerSetting{ + BaseExtEntity: boltz.BaseExtEntity{ + Id: ControllerSettingGlobalId, + IsSystem: true, + }, + Oidc: &OidcSettingDef{ + RedirectUris: redirects, + PostLogoutUris: postLogouts, + }, + IsMigration: true, + } + + step.SetError(m.stores.ControllerSetting.CreateGlobalDefault(step.Ctx, settings)) +} diff --git a/controller/db/migrations.go b/controller/db/migrations.go index 0ba176660..002d9d7ce 100644 --- a/controller/db/migrations.go +++ b/controller/db/migrations.go @@ -24,7 +24,7 @@ import ( ) const ( - CurrentDbVersion = 37 + CurrentDbVersion = 38 FieldVersion = "version" ) @@ -178,6 +178,10 @@ func (m *Migrations) migrate(step *boltz.MigrationStep) int { m.setAuthenticatorIsIssuedByNetwork(step) } + if step.CurrentVersion < 38 { + m.addGlobalControllerConfig(step) + } + // current version if step.CurrentVersion <= CurrentDbVersion { return CurrentDbVersion diff --git a/controller/db/stores.go b/controller/db/stores.go index 5ef38ae31..46964a913 100644 --- a/controller/db/stores.go +++ b/controller/db/stores.go @@ -107,6 +107,7 @@ type Stores struct { Config ConfigStore ConfigType ConfigTypeStore Controller ControllerStore + ControllerSetting ControllerSettingStore EdgeRouter EdgeRouterStore EdgeRouterPolicy EdgeRouterPolicyStore EdgeService EdgeServiceStore @@ -218,6 +219,7 @@ type stores struct { serviceEdgeRouterPolicy *serviceEdgeRouterPolicyStoreImpl servicePolicy *servicePolicyStoreImpl session *sessionStoreImpl + setting *controllerSettingStoreImpl transitRouter *transitRouterStoreImpl enrollment *enrollmentStoreImpl authenticator *authenticatorStoreImpl @@ -275,6 +277,7 @@ func InitStores(db boltz.Db, rateLimiter rate.RateLimiter, signingCert *x509.Cer internalStores.revocation = newRevocationStore(internalStores) internalStores.serviceEdgeRouterPolicy = newServiceEdgeRouterPolicyStore(internalStores) internalStores.servicePolicy = newServicePolicyStore(internalStores) + internalStores.setting = newControllerSettingStore(dbProvider, internalStores) internalStores.session = newSessionStore(internalStores) internalStores.postureCheck = newPostureCheckStore(internalStores) internalStores.postureCheckType = newPostureCheckTypeStore(internalStores) @@ -306,6 +309,7 @@ func InitStores(db boltz.Db, rateLimiter rate.RateLimiter, signingCert *x509.Cer ServiceEdgeRouterPolicy: internalStores.serviceEdgeRouterPolicy, ServicePolicy: internalStores.servicePolicy, Session: internalStores.session, + ControllerSetting: internalStores.setting, Authenticator: internalStores.authenticator, Enrollment: internalStores.enrollment, PostureCheck: internalStores.postureCheck, diff --git a/controller/env/appenv.go b/controller/env/appenv.go index 7a5d04c7b..6906c347d 100644 --- a/controller/env/appenv.go +++ b/controller/env/appenv.go @@ -405,6 +405,10 @@ func (ae *AppEnv) GetPeerSigners() []*x509.Certificate { return ae.HostController.GetPeerSigners() } +func (ae *AppEnv) GetControllerId() string { + return ae.HostController.Identity().ServerCert()[0].Leaf.Subject.CommonName +} + func (ae *AppEnv) GetCommandDispatcher() command.Dispatcher { return ae.HostController.GetCommandDispatcher() } diff --git a/controller/internal/routes/controller_setting_api_model.go b/controller/internal/routes/controller_setting_api_model.go new file mode 100644 index 000000000..fa9ee33d3 --- /dev/null +++ b/controller/internal/routes/controller_setting_api_model.go @@ -0,0 +1,133 @@ +/* + 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/foundation/v2/stringz" + "github.com/openziti/ziti/controller/db" + "github.com/openziti/ziti/controller/env" + "github.com/openziti/ziti/controller/model" + "github.com/openziti/ziti/controller/models" + "github.com/openziti/ziti/controller/response" +) + +const EntityNameControllerSetting = "controller-settings" + +var ControllerSettingLinkFactory = NewBasicLinkFactory(EntityNameControllerSetting) + +func mapControllerSettingToRest(setting *model.ControllerSetting) *rest_model.ControllerSettings { + if setting == nil { + return nil + } + + result := &rest_model.ControllerSettings{ + Oidc: &rest_model.ControllerSettingsOidc{ + RedirectUris: setting.Oidc.RedirectUris, + PostLogoutUris: setting.Oidc.PostLogoutUris, + }, + } + + return result +} + +func MapControllerSettingDetailRest(_ *env.AppEnv, _ *response.RequestContext, settings *model.ControllerSetting) (any, error) { + ret := &rest_model.ControllerSettingDetail{ + BaseEntity: BaseEntityToRestModel(settings, ControllerSettingLinkFactory), + ControllerSettings: *mapControllerSettingToRest(settings), + } + + return ret, nil +} + +func MapControllerSettingEffectiveToRest(_ *env.AppEnv, _ *response.RequestContext, settings *model.ControllerSettingEffective) (*rest_model.ControllerSettingEffective, error) { + ret := &rest_model.ControllerSettingEffective{ + BaseEntity: BaseEntityToRestModel(settings, ControllerSettingLinkFactory), + Effective: mapControllerSettingToRest(settings.Effective), + Instance: mapControllerSettingToRest(settings.Instance), + } + return ret, nil +} + +func MapCreateControllerSettingToModel(setting *rest_model.ControllerSettingCreate) (*model.ControllerSetting, error) { + result := &model.ControllerSetting{ + BaseEntity: models.BaseEntity{ + Tags: TagsOrDefault(setting.Tags), + Id: stringz.OrEmpty(setting.ControllerID), + }, + Oidc: nil, + } + + if setting.Oidc != nil { + result.Oidc = &model.OidcSettings{ + OidcSettingDef: &db.OidcSettingDef{ + RedirectUris: setting.Oidc.RedirectUris, + PostLogoutUris: setting.Oidc.PostLogoutUris, + }, + } + } + + return result, nil +} + +func MapUpdateControllerSettingToModel(id string, setting *rest_model.ControllerSettingUpdate) (*model.ControllerSetting, error) { + result := &model.ControllerSetting{ + BaseEntity: models.BaseEntity{ + Id: id, + }, + } + var err error + + result.Oidc, err = MapOidcSettingToModel(setting.Oidc) + + if err != nil { + return nil, err + } + + return result, nil +} + +func MapPatchControllerSettingToModel(id string, setting *rest_model.ControllerSettingPatch) (*model.ControllerSetting, error) { + result := &model.ControllerSetting{ + BaseEntity: models.BaseEntity{ + Id: id, + }, + } + var err error + + result.Oidc, err = MapOidcSettingToModel(setting.Oidc) + + if err != nil { + return nil, err + } + + return result, nil +} + +func MapOidcSettingToModel(oidc *rest_model.ControllerSettingsOidc) (*model.OidcSettings, error) { + var result *model.OidcSettings + if oidc != nil { + result = &model.OidcSettings{ + OidcSettingDef: &db.OidcSettingDef{ + RedirectUris: oidc.RedirectUris, + PostLogoutUris: oidc.PostLogoutUris, + }, + } + } + + return result, nil +} diff --git a/controller/internal/routes/controller_setting_router.go b/controller/internal/routes/controller_setting_router.go new file mode 100644 index 000000000..01a6efcaa --- /dev/null +++ b/controller/internal/routes/controller_setting_router.go @@ -0,0 +1,138 @@ +/* + 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/errors" + "github.com/go-openapi/runtime/middleware" + "github.com/openziti/edge-api/rest_management_api_server/operations/settings" + "github.com/openziti/metrics" + "github.com/openziti/ziti/controller/env" + "github.com/openziti/ziti/controller/fields" + "github.com/openziti/ziti/controller/internal/permissions" + "github.com/openziti/ziti/controller/model" + "github.com/openziti/ziti/controller/response" +) + +func init() { + r := NewControllerSettingRouter() + env.AddRouter(r) +} + +type ControllerSettingRouter struct { + BasePath string + createTimer metrics.Timer +} + +func NewControllerSettingRouter() *ControllerSettingRouter { + return &ControllerSettingRouter{ + BasePath: "/" + EntityNameControllerSetting, + } +} + +func (r *ControllerSettingRouter) Register(ae *env.AppEnv) { + + //Management + ae.ManagementApi.SettingsListControllerSettingsHandler = settings.ListControllerSettingsHandlerFunc(func(params settings.ListControllerSettingsParams, _ interface{}) middleware.Responder { + return ae.IsAllowed(r.List, params.HTTPRequest, "", "", permissions.IsAdmin()) + }) + + ae.ManagementApi.SettingsDetailControllerSettingHandler = settings.DetailControllerSettingHandlerFunc(func(params settings.DetailControllerSettingParams, _ interface{}) middleware.Responder { + return ae.IsAllowed(r.Detail, params.HTTPRequest, params.ID, "", permissions.IsAdmin()) + }) + + ae.ManagementApi.SettingsCreateControllerSettingHandler = settings.CreateControllerSettingHandlerFunc(func(params settings.CreateControllerSettingParams, _ interface{}) middleware.Responder { + return ae.IsAllowed(func(ae *env.AppEnv, rc *response.RequestContext) { + r.Create(ae, rc, params) + }, params.HTTPRequest, "", "", permissions.IsAdmin()) + }) + + ae.ManagementApi.SettingsUpdateControllerSettingHandler = settings.UpdateControllerSettingHandlerFunc(func(params settings.UpdateControllerSettingParams, _ interface{}) middleware.Responder { + return ae.IsAllowed(func(ae *env.AppEnv, rc *response.RequestContext) { + r.Update(ae, rc, params) + }, params.HTTPRequest, params.ID, "", permissions.IsAdmin()) + }) + ae.ManagementApi.SettingsPatchControllerSettingHandler = settings.PatchControllerSettingHandlerFunc(func(params settings.PatchControllerSettingParams, _ interface{}) middleware.Responder { + return ae.IsAllowed(func(ae *env.AppEnv, rc *response.RequestContext) { + r.Patch(ae, rc, params) + }, params.HTTPRequest, params.ID, "", permissions.IsAdmin()) + }) + ae.ManagementApi.SettingsDeleteControllerSettingHandler = settings.DeleteControllerSettingHandlerFunc(func(params settings.DeleteControllerSettingParams, _ interface{}) middleware.Responder { + return ae.IsAllowed(r.Delete, params.HTTPRequest, params.ID, "", permissions.IsAdmin()) + }) +} + +func (r *ControllerSettingRouter) List(ae *env.AppEnv, rc *response.RequestContext) { + ListWithHandler[*model.ControllerSetting](ae, rc, ae.Managers.ControllerSetting, MapControllerSettingDetailRest) +} + +func (r *ControllerSettingRouter) Detail(ae *env.AppEnv, rc *response.RequestContext) { + DetailWithHandler[*model.ControllerSetting](ae, rc, ae.Managers.ControllerSetting, MapControllerSettingDetailRest) +} + +func (r *ControllerSettingRouter) Delete(ae *env.AppEnv, rc *response.RequestContext) { + DeleteWithHandler(rc, ae.Managers.ControllerSetting) +} + +func (r *ControllerSettingRouter) DetailEffective(ae *env.AppEnv, rc *response.RequestContext) { + Detail(rc, func(rc *response.RequestContext, id string) (interface{}, error) { + effective, err := ae.Managers.ControllerSetting.ReadEffective(id) + if err != nil { + return nil, err + } + return MapControllerSettingEffectiveToRest(ae, rc, effective) + }) +} + +func (r *ControllerSettingRouter) Create(ae *env.AppEnv, rc *response.RequestContext, params settings.CreateControllerSettingParams) { + if params.ControllerSetting == nil { + ae.ManagementApi.ServeErrorFor("")(rc.ResponseWriter, rc.Request, errors.Required("data", "body", nil)) + return + } + + Create(rc, rc, ConfigLinkFactory, func() (string, error) { + entity, err := MapCreateControllerSettingToModel(params.ControllerSetting) + if err != nil { + return "", err + } + return MapCreate(ae.Managers.ControllerSetting.Create, entity, rc) + }) +} + +func (r *ControllerSettingRouter) Update(ae *env.AppEnv, rc *response.RequestContext, params settings.UpdateControllerSettingParams) { + Update(rc, func(id string) error { + setting, err := MapUpdateControllerSettingToModel(params.ID, params.ControllerSetting) + + if err != nil { + return err + } + + return ae.Managers.ControllerSetting.Update(setting, nil, rc.NewChangeContext()) + }) +} + +func (r *ControllerSettingRouter) Patch(ae *env.AppEnv, rc *response.RequestContext, params settings.PatchControllerSettingParams) { + Patch(rc, func(id string, fields fields.UpdatedFields) error { + setting, err := MapPatchControllerSettingToModel(params.ID, params.ControllerSetting) + + if err != nil { + return err + } + + return ae.Managers.ControllerSetting.Update(setting, fields.FilterMaps("tags"), rc.NewChangeContext()) + }) +} diff --git a/controller/model/controller_setting_manager.go b/controller/model/controller_setting_manager.go new file mode 100644 index 000000000..30e6c8928 --- /dev/null +++ b/controller/model/controller_setting_manager.go @@ -0,0 +1,202 @@ +package model + +import ( + "errors" + "fmt" + "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/fields" + "github.com/openziti/ziti/controller/models" + "go.etcd.io/bbolt" + "google.golang.org/protobuf/proto" +) + +var _ edgeEntity[*db.ControllerSetting] = (*ControllerSetting)(nil) +var _ boltz.ExtEntity = (*db.ControllerSetting)(nil) + +func newControllerSettingManager(env Env) *ControllerSettingManager { + result := &ControllerSettingManager{ + baseEntityManager: newBaseEntityManager[*ControllerSetting, *db.ControllerSetting](env, env.GetStores().ControllerSetting), + } + result.impl = result + + RegisterManagerDecoder[*ControllerSetting](env, result) + + return result +} + +type ControllerSettingManager struct { + baseEntityManager[*ControllerSetting, *db.ControllerSetting] +} + +// ReadEffective returns a controller setting object that contains the effective settings and instance settings for a +// specific controller. Effective settings are global + instance overrides. +func (s *ControllerSettingManager) ReadEffective(id string) (*ControllerSettingEffective, error) { + + var global, instance, effective *ControllerSetting + + err := s.env.GetDb().View(func(tx *bbolt.Tx) error { + var err error + globalSt, err := s.Store.LoadById(tx, db.ControllerSettingGlobalId) + + if err != nil { + return fmt.Errorf("could not read global settings: %w", err) + } + + global = &ControllerSetting{} + + err = global.fillFrom(s.env, tx, globalSt) + + if err != nil { + return fmt.Errorf("could not fill global settings: %w", err) + } + + // if reading effective of global, don't do any more work, global == effective == instance + if id == db.ControllerSettingGlobalId { + instance = global + effective = global + return nil + } + + instanceSt, err := s.Store.LoadById(tx, id) + + if err != nil && !boltz.IsErrNotFoundErr(err) { + return fmt.Errorf("could not read instance settings: %w", err) + } + + if instanceSt != nil { + instance = &ControllerSetting{} + err = instance.fillFrom(s.env, tx, instanceSt) + + effectiveSt := instanceSt.MergeSettings(globalSt) + + err = effective.fillFrom(s.env, tx, effectiveSt) + + if err != nil { + return fmt.Errorf("could not fill effective settings: %w", err) + } + } else { + effective = global + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &ControllerSettingEffective{ + Effective: effective, + Instance: instance, + }, nil +} + +func (s *ControllerSettingManager) newModelEntity() *ControllerSetting { + return &ControllerSetting{ + BaseEntity: models.BaseEntity{}, + Oidc: &OidcSettings{ + OidcSettingDef: &db.OidcSettingDef{ + RedirectUris: nil, + PostLogoutUris: nil, + }, + }, + } +} + +type ControllerSettingListener func(settingPath string, setting *ControllerSetting) + +func (s *ControllerSettingManager) Watch(settingPath string, listener func(string, *ControllerSetting)) { + s.env.GetStores().ControllerSetting.Watch(settingPath, func(setting string, controllerId string, settingEvent *db.ControllerSettingsEvent) { + + controllerSettingModel := &ControllerSetting{ + BaseEntity: models.BaseEntity{}, + Oidc: &OidcSettings{ + OidcSettingDef: &db.OidcSettingDef{}, + }, + } + + controllerSettingModel.BaseEntity.FillCommon(settingEvent.Effective) + controllerSettingModel.Oidc.OidcSettingDef = settingEvent.Effective.Oidc + + listener(settingPath, controllerSettingModel) + }, s.env.GetControllerId()) +} + +func (s *ControllerSettingManager) Marshall(entity *ControllerSetting) ([]byte, error) { + tags, err := edge_cmd_pb.EncodeTags(entity.Tags) + if err != nil { + return nil, err + } + + msg := &edge_cmd_pb.ControllerSetting{ + Id: entity.Id, + Tags: tags, + Oidc: &edge_cmd_pb.ControllerSetting_Oidc{ + RedirectUri: entity.Oidc.RedirectUris, + PostLogoutUri: entity.Oidc.PostLogoutUris, + }, + } + + return proto.Marshal(msg) +} + +func (s *ControllerSettingManager) Unmarshall(bytes []byte) (*ControllerSetting, error) { + msg := &edge_cmd_pb.ControllerSetting{} + if err := proto.Unmarshal(bytes, msg); err != nil { + return nil, err + } + + return &ControllerSetting{ + BaseEntity: models.BaseEntity{ + Id: msg.Id, + Tags: edge_cmd_pb.DecodeTags(msg.Tags), + }, + Oidc: &OidcSettings{ + OidcSettingDef: &db.OidcSettingDef{ + RedirectUris: msg.Oidc.RedirectUri, + PostLogoutUris: msg.Oidc.PostLogoutUri, + }, + }, + }, nil +} + +func (s *ControllerSettingManager) ApplyCreate(cmd *command.CreateEntityCommand[*ControllerSetting], ctx boltz.MutateContext) error { + _, err := s.createEntity(cmd.Entity, ctx) + return err +} + +func (s *ControllerSettingManager) ApplyUpdate(cmd *command.UpdateEntityCommand[*ControllerSetting], ctx boltz.MutateContext) error { + return s.updateEntity(cmd.Entity, cmd.UpdatedFields, ctx) +} + +func (s *ControllerSettingManager) Create(setting *ControllerSetting, ctx *change.Context) error { + + if setting.Id == "" { + return errors.New("id is required") + } + + if setting.Id == db.ControllerSettingGlobalId || setting.Id == db.ControllerSettingAny { + return fmt.Errorf("cannot create settings for controllers with id: %s", setting.Id) + } + + controller, err := s.env.GetManagers().Controller.Read(setting.Id) + + if err != nil || controller == nil { + return fmt.Errorf("could not locate controller with id: %s", setting.Id) + } + + return DispatchCreate[*ControllerSetting](s, setting, ctx) +} + +func (s *ControllerSettingManager) Update(setting *ControllerSetting, checker fields.UpdatedFields, ctx *change.Context) error { + + if setting.Id == db.ControllerSettingAny { + return fmt.Errorf("cannot update settings for controllers with id: %s", setting.Id) + } + + return DispatchUpdate[*ControllerSetting](s, setting, checker, ctx) +} diff --git a/controller/model/controller_setting_model.go b/controller/model/controller_setting_model.go new file mode 100644 index 000000000..0054b0112 --- /dev/null +++ b/controller/model/controller_setting_model.go @@ -0,0 +1,55 @@ +package model + +import ( + "github.com/openziti/storage/boltz" + "github.com/openziti/ziti/controller/db" + "github.com/openziti/ziti/controller/models" + "go.etcd.io/bbolt" +) + +type TrustDomainSettings struct { + TrustDomain string + AdditionalTrustDomains []string +} + +type ControllerSetting struct { + models.BaseEntity + Oidc *OidcSettings + IsMigration bool +} + +type ControllerSettingEffective struct { + models.BaseEntity + Effective *ControllerSetting + Instance *ControllerSetting +} + +func (s *ControllerSetting) fillFrom(env Env, tx *bbolt.Tx, boltEntity *db.ControllerSetting) error { + s.Oidc = &OidcSettings{ + OidcSettingDef: boltEntity.Oidc, + } + + s.IsMigration = boltEntity.IsMigration + + return nil +} + +func (s *ControllerSetting) toBoltEntity() (*db.ControllerSetting, error) { + return &db.ControllerSetting{ + BaseExtEntity: *boltz.NewExtEntity(s.Id, s.Tags), + Oidc: s.Oidc.OidcSettingDef, + IsMigration: s.IsMigration, + }, nil +} + +func (s *ControllerSetting) toBoltEntityForCreate(_ *bbolt.Tx, _ Env) (*db.ControllerSetting, error) { + return s.toBoltEntity() +} + +func (s *ControllerSetting) toBoltEntityForUpdate(_ *bbolt.Tx, _ Env, _ boltz.FieldChecker) (*db.ControllerSetting, error) { + return s.toBoltEntity() +} + +type OidcSettings struct { + *db.OidcSettingDef +} diff --git a/controller/model/env.go b/controller/model/env.go index 070f890ec..624d99c0e 100644 --- a/controller/model/env.go +++ b/controller/model/env.go @@ -65,5 +65,7 @@ type Env interface { GetApiAddresses() (map[string][]event.ApiAddress, []byte) GetCloseNotifyChannel() <-chan struct{} GetPeerSigners() []*x509.Certificate + + GetControllerId() string AddRouterPresenceHandler(h RouterPresenceHandler) } diff --git a/controller/model/managers.go b/controller/model/managers.go index b3abc952f..1c18aa929 100644 --- a/controller/model/managers.go +++ b/controller/model/managers.go @@ -53,6 +53,7 @@ type Managers struct { Config *ConfigManager ConfigType *ConfigTypeManager Controller *ControllerManager + ControllerSetting *ControllerSettingManager EdgeRouter *EdgeRouterManager EdgeRouterPolicy *EdgeRouterPolicyManager EdgeService *EdgeServiceManager @@ -97,6 +98,7 @@ func (managers *Managers) Init(env Env) *Managers { managers.Config = NewConfigManager(env) managers.ConfigType = NewConfigTypeManager(env) managers.Controller = NewControllerManager(env) + managers.ControllerSetting = newControllerSettingManager(env) managers.EdgeRouter = NewEdgeRouterManager(env) managers.EdgeRouterPolicy = NewEdgeRouterPolicyManager(env) managers.EdgeService = NewEdgeServiceManager(env) diff --git a/controller/model/testing.go b/controller/model/testing.go index a3305350c..08bd17a81 100644 --- a/controller/model/testing.go +++ b/controller/model/testing.go @@ -52,6 +52,11 @@ type TestContext struct { eventDispatcher event.Dispatcher } +func (ctx *TestContext) GetControllerId() string { + //TODO implement me + panic("implement me") +} + func (ctx *TestContext) GetEnrollmentJwtSigner() (jwtsigner.Signer, error) { return ctx, nil } diff --git a/etc/ctrl.with.edge.yml b/etc/ctrl.with.edge.yml index dc21f6cf1..a7842057f 100644 --- a/etc/ctrl.with.edge.yml +++ b/etc/ctrl.with.edge.yml @@ -79,11 +79,11 @@ ctrl: # connections. The value of newListener must be resolvable both via DNS and validate via certificates #newListener: tls:localhost:6262 -events: - jsonLogger: - subscriptions: - - type: connect - - type: sdk +#events: +# jsonLogger: +# subscriptions: +# - type: connect +# - type: sdk # - type: entityChange # include: # - services @@ -105,10 +105,10 @@ events: # - type: services # - type: edge.entityCounts # interval: 5s - handler: - type: file - format: json - path: /tmp/ziti-events.log +# handler: +# type: file +# format: json +# path: /tmp/ziti-events.log # usageLogger: # subscriptions: # - type: fabric.usage diff --git a/tests/context.go b/tests/context.go index d08cde88e..dd398da50 100644 --- a/tests/context.go +++ b/tests/context.go @@ -220,7 +220,7 @@ func (ctx *TestContext) NewEdgeManagementApi(totpProvider func(chan string)) *ed if totpProvider == nil { totpProvider = func(chan string) {} } - return edge_apis.NewManagementApiClient([]*url.URL{ctx.ClientApiUrl()}, ctx.ControllerCaPool(), totpProvider) + return edge_apis.NewManagementApiClient([]*url.URL{ctx.ManagementApiUrl()}, ctx.ControllerCaPool(), totpProvider) } func (ctx *TestContext) NewTransportWithIdentity(i idlib.Identity) *http.Transport { diff --git a/tests/controller_settings_test.go b/tests/controller_settings_test.go new file mode 100644 index 000000000..fa24994f3 --- /dev/null +++ b/tests/controller_settings_test.go @@ -0,0 +1,228 @@ +//go:build apitests +// +build apitests + +/* + 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 tests + +import ( + "github.com/openziti/edge-api/rest_management_api_client/settings" + "github.com/openziti/edge-api/rest_model" + "github.com/openziti/edge-api/rest_util" + "github.com/openziti/foundation/v2/stringz" + edge_apis "github.com/openziti/sdk-golang/edge-apis" + "github.com/openziti/ziti/controller/db" + "sort" + "testing" +) + +func Test_ControllerSettings(t *testing.T) { + ctx := NewTestContext(t) + defer ctx.Teardown() + ctx.StartServer() + ctx.RequireAdminManagementApiLogin() + + managementClient := ctx.NewEdgeManagementApi(func(strings chan string) { + strings <- "" + }) + + adminCreds := edge_apis.NewUpdbCredentials(ctx.AdminAuthenticator.Username, ctx.AdminAuthenticator.Password) + apiSession, err := managementClient.Authenticate(adminCreds, nil) + + ctx.Req.NoError(err) + ctx.Req.NotNil(apiSession) + + defaultRedirects := []string{ + "openziti://auth/callback", + "https://127.0.0.1:*/auth/callback", + "http://127.0.0.1:*/auth/callback", + "https://localhost:*/auth/callback", + "http://localhost:*/auth/callback", + "http://[::1]:*/auth/callback", + "https://[::1]:*/auth/callback", + } + + defaultPostLogouts := []string{ + "openziti://auth/logout", + "https://127.0.0.1:*/auth/logout", + "http://127.0.0.1:*/auth/logout", + "https://localhost:*/auth/logout", + "http://localhost:*/auth/logout", + "http://[::1]:*/auth/logout", + "https://[::1]:*/auth/logout", + } + + sort.Strings(defaultPostLogouts) + sort.Strings(defaultRedirects) + + t.Run("can retrieve the default global settings", func(t *testing.T) { + ctx.testContextChanged(t) + + params := settings.NewDetailControllerSettingParams() + params.ID = "global" + + resp, err := managementClient.API.Settings.DetailControllerSetting(params, nil) + ctx.Req.NoError(rest_util.WrapErr(err)) + + t.Run("has default redirects", func(t *testing.T) { + ctx.testContextChanged(t) + sort.Strings(resp.Payload.Data.Oidc.RedirectUris) + ctx.Req.True(stringz.EqualSlices(resp.Payload.Data.Oidc.RedirectUris, defaultRedirects), "default global redirects did not match, expected: %s, got: %s", defaultRedirects, resp.Payload.Data.Oidc.RedirectUris) + }) + + t.Run("has default post logout redirects", func(t *testing.T) { + ctx.testContextChanged(t) + sort.Strings(resp.Payload.Data.Oidc.PostLogoutUris) + ctx.Req.True(stringz.EqualSlices(resp.Payload.Data.Oidc.PostLogoutUris, defaultPostLogouts), "default global post logouts did not match, expected: %s, got: %s", defaultRedirects, resp.Payload.Data.Oidc.PostLogoutUris) + }) + }) + + t.Run("cannot delete the global settings", func(t *testing.T) { + ctx.testContextChanged(t) + + params := settings.NewDeleteControllerSettingParams() + params.ID = "global" + + resp, err := managementClient.API.Settings.DeleteControllerSetting(params, nil) + ctx.Req.Error(err) + ctx.Req.Nil(resp) + }) + + t.Run("global settings can be updated", func(t *testing.T) { + ctx.testContextChanged(t) + + type event struct { + Setting string + ControllerId string + Event *db.ControllerSettingsEvent + } + oidcAnyEvent := event{} + ctx.EdgeController.AppEnv.Stores.ControllerSetting.Watch(db.FieldControllerSettingOidc, func(setting string, controllerId string, settingEvent *db.ControllerSettingsEvent) { + oidcAnyEvent.Setting = setting + oidcAnyEvent.ControllerId = controllerId + oidcAnyEvent.Event = settingEvent + }, db.ControllerSettingAny) + + oidcAnyRedirectEvent := event{} + ctx.EdgeController.AppEnv.Stores.ControllerSetting.Watch(db.FieldControllerSettingOidcRedirectUris, func(setting string, controllerId string, settingEvent *db.ControllerSettingsEvent) { + oidcAnyRedirectEvent.Setting = setting + oidcAnyRedirectEvent.ControllerId = controllerId + oidcAnyRedirectEvent.Event = settingEvent + }, db.ControllerSettingAny) + + oidcAnyPostLogoutEvent := event{} + ctx.EdgeController.AppEnv.Stores.ControllerSetting.Watch(db.FieldControllerSettingOidcPostLogoutUris, func(setting string, controllerId string, settingEvent *db.ControllerSettingsEvent) { + oidcAnyPostLogoutEvent.Setting = setting + oidcAnyPostLogoutEvent.ControllerId = controllerId + oidcAnyPostLogoutEvent.Event = settingEvent + }, db.ControllerSettingAny) + + oidcGlobalEvent := event{} + ctx.EdgeController.AppEnv.Stores.ControllerSetting.Watch(db.FieldControllerSettingOidc, func(setting string, controllerId string, settingEvent *db.ControllerSettingsEvent) { + oidcGlobalEvent.Setting = setting + oidcGlobalEvent.ControllerId = controllerId + oidcGlobalEvent.Event = settingEvent + }, db.ControllerSettingGlobalId) + + oidcGlobalRedirectEvent := event{} + ctx.EdgeController.AppEnv.Stores.ControllerSetting.Watch(db.FieldControllerSettingOidcRedirectUris, func(setting string, controllerId string, settingEvent *db.ControllerSettingsEvent) { + oidcGlobalRedirectEvent.Setting = setting + oidcGlobalRedirectEvent.ControllerId = controllerId + oidcGlobalRedirectEvent.Event = settingEvent + }, db.ControllerSettingGlobalId) + + oidcGlobalPostLogoutEvent := event{} + ctx.EdgeController.AppEnv.Stores.ControllerSetting.Watch(db.FieldControllerSettingOidcPostLogoutUris, func(setting string, controllerId string, settingEvent *db.ControllerSettingsEvent) { + oidcGlobalPostLogoutEvent.Setting = setting + oidcGlobalPostLogoutEvent.ControllerId = controllerId + oidcGlobalPostLogoutEvent.Event = settingEvent + }, db.ControllerSettingGlobalId) + + params := settings.NewPatchControllerSettingParams() + params.ID = "global" + params.ControllerSetting = &rest_model.ControllerSettingPatch{ + ControllerSettings: rest_model.ControllerSettings{ + Oidc: &rest_model.ControllerSettingsOidc{ + PostLogoutUris: []string{ + "http://127.0.0.1:*/auth/logout", + }, + RedirectUris: []string{ + "http://127.0.0.1:*/auth/callback", + }, + }, + }, + } + + resp, err := managementClient.API.Settings.PatchControllerSetting(params, nil) + ctx.Req.NoError(err) + ctx.Req.NotNil(resp) + + t.Run("patching global setting triggers any oidc event", func(t *testing.T) { + ctx.testContextChanged(t) + ctx.Req.NotEmpty(oidcAnyEvent.Setting) + ctx.Req.NotEmpty(oidcAnyEvent.ControllerId) + ctx.Req.NotNil(oidcAnyEvent.Event) + ctx.Req.NotNil(oidcAnyEvent.Event.Global) + ctx.Req.NotNil(oidcAnyEvent.Event.Effective) + }) + + t.Run("patching global setting triggers any oidc redirect event", func(t *testing.T) { + ctx.testContextChanged(t) + ctx.Req.NotEmpty(oidcAnyRedirectEvent.Setting) + ctx.Req.NotEmpty(oidcAnyRedirectEvent.ControllerId) + ctx.Req.NotNil(oidcAnyRedirectEvent.Event) + ctx.Req.NotNil(oidcAnyRedirectEvent.Event.Global) + ctx.Req.NotNil(oidcAnyRedirectEvent.Event.Effective) + }) + + t.Run("patching global setting triggers any oidc post logout event", func(t *testing.T) { + ctx.testContextChanged(t) + ctx.Req.NotEmpty(oidcAnyPostLogoutEvent.Setting) + ctx.Req.NotEmpty(oidcAnyPostLogoutEvent.ControllerId) + ctx.Req.NotNil(oidcAnyPostLogoutEvent.Event) + ctx.Req.NotNil(oidcAnyPostLogoutEvent.Event.Global) + ctx.Req.NotNil(oidcAnyPostLogoutEvent.Event.Effective) + }) + + t.Run("patching global setting triggers global oidc event", func(t *testing.T) { + ctx.testContextChanged(t) + ctx.Req.NotEmpty(oidcGlobalEvent.Setting) + ctx.Req.NotEmpty(oidcGlobalEvent.ControllerId) + ctx.Req.NotNil(oidcGlobalEvent.Event) + ctx.Req.NotNil(oidcGlobalEvent.Event.Global) + ctx.Req.NotNil(oidcGlobalEvent.Event.Effective) + }) + + t.Run("patching global setting triggers global oidc redirect event", func(t *testing.T) { + ctx.testContextChanged(t) + ctx.Req.NotEmpty(oidcGlobalRedirectEvent.Setting) + ctx.Req.NotEmpty(oidcGlobalRedirectEvent.ControllerId) + ctx.Req.NotNil(oidcGlobalRedirectEvent.Event) + ctx.Req.NotNil(oidcGlobalRedirectEvent.Event.Global) + ctx.Req.NotNil(oidcGlobalRedirectEvent.Event.Effective) + }) + + t.Run("patching global setting triggers global oidc post logout event", func(t *testing.T) { + ctx.testContextChanged(t) + ctx.Req.NotEmpty(oidcGlobalPostLogoutEvent.Setting) + ctx.Req.NotEmpty(oidcGlobalPostLogoutEvent.ControllerId) + ctx.Req.NotNil(oidcGlobalPostLogoutEvent.Event) + ctx.Req.NotNil(oidcGlobalPostLogoutEvent.Event.Global) + ctx.Req.NotNil(oidcGlobalPostLogoutEvent.Event.Effective) + }) + }) +}