diff --git a/pkg/proto/v0/settings.pb.go b/pkg/proto/v0/settings.pb.go index a548a539f..986bf4424 100644 --- a/pkg/proto/v0/settings.pb.go +++ b/pkg/proto/v0/settings.pb.go @@ -8,6 +8,7 @@ package proto import ( proto "github.com/golang/protobuf/proto" + empty "github.com/golang/protobuf/ptypes/empty" _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" @@ -88,7 +89,7 @@ func (x Resource_Type) Number() protoreflect.EnumNumber { // Deprecated: Use Resource_Type.Descriptor instead. func (Resource_Type) EnumDescriptor() ([]byte, []int) { - return file_settings_proto_rawDescGZIP(), []int{15, 0} + return file_settings_proto_rawDescGZIP(), []int{24, 0} } type Bundle_Type int32 @@ -137,7 +138,114 @@ func (x Bundle_Type) Number() protoreflect.EnumNumber { // Deprecated: Use Bundle_Type.Descriptor instead. func (Bundle_Type) EnumDescriptor() ([]byte, []int) { - return file_settings_proto_rawDescGZIP(), []int{16, 0} + return file_settings_proto_rawDescGZIP(), []int{25, 0} +} + +type Permission_Operation int32 + +const ( + Permission_OPERATION_UNKNOWN Permission_Operation = 0 + Permission_OPERATION_CREATE Permission_Operation = 1 + Permission_OPERATION_READ Permission_Operation = 2 + Permission_OPERATION_UPDATE Permission_Operation = 3 + Permission_OPERATION_DELETE Permission_Operation = 4 +) + +// Enum value maps for Permission_Operation. +var ( + Permission_Operation_name = map[int32]string{ + 0: "OPERATION_UNKNOWN", + 1: "OPERATION_CREATE", + 2: "OPERATION_READ", + 3: "OPERATION_UPDATE", + 4: "OPERATION_DELETE", + } + Permission_Operation_value = map[string]int32{ + "OPERATION_UNKNOWN": 0, + "OPERATION_CREATE": 1, + "OPERATION_READ": 2, + "OPERATION_UPDATE": 3, + "OPERATION_DELETE": 4, + } +) + +func (x Permission_Operation) Enum() *Permission_Operation { + p := new(Permission_Operation) + *p = x + return p +} + +func (x Permission_Operation) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Permission_Operation) Descriptor() protoreflect.EnumDescriptor { + return file_settings_proto_enumTypes[2].Descriptor() +} + +func (Permission_Operation) Type() protoreflect.EnumType { + return &file_settings_proto_enumTypes[2] +} + +func (x Permission_Operation) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Permission_Operation.Descriptor instead. +func (Permission_Operation) EnumDescriptor() ([]byte, []int) { + return file_settings_proto_rawDescGZIP(), []int{33, 0} +} + +type Permission_Constraint int32 + +const ( + Permission_CONSTRAINT_UNKNOWN Permission_Constraint = 0 + Permission_CONSTRAINT_OWN Permission_Constraint = 1 + Permission_CONSTRAINT_SHARED Permission_Constraint = 2 + Permission_CONSTRAINT_ALL Permission_Constraint = 3 +) + +// Enum value maps for Permission_Constraint. +var ( + Permission_Constraint_name = map[int32]string{ + 0: "CONSTRAINT_UNKNOWN", + 1: "CONSTRAINT_OWN", + 2: "CONSTRAINT_SHARED", + 3: "CONSTRAINT_ALL", + } + Permission_Constraint_value = map[string]int32{ + "CONSTRAINT_UNKNOWN": 0, + "CONSTRAINT_OWN": 1, + "CONSTRAINT_SHARED": 2, + "CONSTRAINT_ALL": 3, + } +) + +func (x Permission_Constraint) Enum() *Permission_Constraint { + p := new(Permission_Constraint) + *p = x + return p +} + +func (x Permission_Constraint) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Permission_Constraint) Descriptor() protoreflect.EnumDescriptor { + return file_settings_proto_enumTypes[3].Descriptor() +} + +func (Permission_Constraint) Type() protoreflect.EnumType { + return &file_settings_proto_enumTypes[3] +} + +func (x Permission_Constraint) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Permission_Constraint.Descriptor instead. +func (Permission_Constraint) EnumDescriptor() ([]byte, []int) { + return file_settings_proto_rawDescGZIP(), []int{33, 1} } // --- @@ -425,7 +533,163 @@ func (x *ListBundlesResponse) GetBundles() []*Bundle { return nil } -// requests and responses for settings values +type AddSettingToBundleRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BundleId string `protobuf:"bytes,1,opt,name=bundle_id,json=bundleId,proto3" json:"bundle_id,omitempty"` + Setting *Setting `protobuf:"bytes,2,opt,name=setting,proto3" json:"setting,omitempty"` +} + +func (x *AddSettingToBundleRequest) Reset() { + *x = AddSettingToBundleRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_settings_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AddSettingToBundleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddSettingToBundleRequest) ProtoMessage() {} + +func (x *AddSettingToBundleRequest) ProtoReflect() protoreflect.Message { + mi := &file_settings_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AddSettingToBundleRequest.ProtoReflect.Descriptor instead. +func (*AddSettingToBundleRequest) Descriptor() ([]byte, []int) { + return file_settings_proto_rawDescGZIP(), []int{6} +} + +func (x *AddSettingToBundleRequest) GetBundleId() string { + if x != nil { + return x.BundleId + } + return "" +} + +func (x *AddSettingToBundleRequest) GetSetting() *Setting { + if x != nil { + return x.Setting + } + return nil +} + +type AddSettingToBundleResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Setting *Setting `protobuf:"bytes,1,opt,name=setting,proto3" json:"setting,omitempty"` +} + +func (x *AddSettingToBundleResponse) Reset() { + *x = AddSettingToBundleResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_settings_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AddSettingToBundleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddSettingToBundleResponse) ProtoMessage() {} + +func (x *AddSettingToBundleResponse) ProtoReflect() protoreflect.Message { + mi := &file_settings_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AddSettingToBundleResponse.ProtoReflect.Descriptor instead. +func (*AddSettingToBundleResponse) Descriptor() ([]byte, []int) { + return file_settings_proto_rawDescGZIP(), []int{7} +} + +func (x *AddSettingToBundleResponse) GetSetting() *Setting { + if x != nil { + return x.Setting + } + return nil +} + +type RemoveSettingFromBundleRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BundleId string `protobuf:"bytes,1,opt,name=bundle_id,json=bundleId,proto3" json:"bundle_id,omitempty"` + SettingId string `protobuf:"bytes,2,opt,name=setting_id,json=settingId,proto3" json:"setting_id,omitempty"` +} + +func (x *RemoveSettingFromBundleRequest) Reset() { + *x = RemoveSettingFromBundleRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_settings_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RemoveSettingFromBundleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveSettingFromBundleRequest) ProtoMessage() {} + +func (x *RemoveSettingFromBundleRequest) ProtoReflect() protoreflect.Message { + mi := &file_settings_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoveSettingFromBundleRequest.ProtoReflect.Descriptor instead. +func (*RemoveSettingFromBundleRequest) Descriptor() ([]byte, []int) { + return file_settings_proto_rawDescGZIP(), []int{8} +} + +func (x *RemoveSettingFromBundleRequest) GetBundleId() string { + if x != nil { + return x.BundleId + } + return "" +} + +func (x *RemoveSettingFromBundleRequest) GetSettingId() string { + if x != nil { + return x.SettingId + } + return "" +} + type SaveValueRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -437,7 +701,7 @@ type SaveValueRequest struct { func (x *SaveValueRequest) Reset() { *x = SaveValueRequest{} if protoimpl.UnsafeEnabled { - mi := &file_settings_proto_msgTypes[6] + mi := &file_settings_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -450,7 +714,7 @@ func (x *SaveValueRequest) String() string { func (*SaveValueRequest) ProtoMessage() {} func (x *SaveValueRequest) ProtoReflect() protoreflect.Message { - mi := &file_settings_proto_msgTypes[6] + mi := &file_settings_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -463,7 +727,7 @@ func (x *SaveValueRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SaveValueRequest.ProtoReflect.Descriptor instead. func (*SaveValueRequest) Descriptor() ([]byte, []int) { - return file_settings_proto_rawDescGZIP(), []int{6} + return file_settings_proto_rawDescGZIP(), []int{9} } func (x *SaveValueRequest) GetValue() *Value { @@ -484,7 +748,7 @@ type SaveValueResponse struct { func (x *SaveValueResponse) Reset() { *x = SaveValueResponse{} if protoimpl.UnsafeEnabled { - mi := &file_settings_proto_msgTypes[7] + mi := &file_settings_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -497,7 +761,7 @@ func (x *SaveValueResponse) String() string { func (*SaveValueResponse) ProtoMessage() {} func (x *SaveValueResponse) ProtoReflect() protoreflect.Message { - mi := &file_settings_proto_msgTypes[7] + mi := &file_settings_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -510,7 +774,7 @@ func (x *SaveValueResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SaveValueResponse.ProtoReflect.Descriptor instead. func (*SaveValueResponse) Descriptor() ([]byte, []int) { - return file_settings_proto_rawDescGZIP(), []int{7} + return file_settings_proto_rawDescGZIP(), []int{10} } func (x *SaveValueResponse) GetValue() *ValueWithIdentifier { @@ -531,7 +795,7 @@ type GetValueRequest struct { func (x *GetValueRequest) Reset() { *x = GetValueRequest{} if protoimpl.UnsafeEnabled { - mi := &file_settings_proto_msgTypes[8] + mi := &file_settings_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -544,7 +808,7 @@ func (x *GetValueRequest) String() string { func (*GetValueRequest) ProtoMessage() {} func (x *GetValueRequest) ProtoReflect() protoreflect.Message { - mi := &file_settings_proto_msgTypes[8] + mi := &file_settings_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -557,7 +821,7 @@ func (x *GetValueRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetValueRequest.ProtoReflect.Descriptor instead. func (*GetValueRequest) Descriptor() ([]byte, []int) { - return file_settings_proto_rawDescGZIP(), []int{8} + return file_settings_proto_rawDescGZIP(), []int{11} } func (x *GetValueRequest) GetId() string { @@ -578,7 +842,7 @@ type GetValueResponse struct { func (x *GetValueResponse) Reset() { *x = GetValueResponse{} if protoimpl.UnsafeEnabled { - mi := &file_settings_proto_msgTypes[9] + mi := &file_settings_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -591,7 +855,7 @@ func (x *GetValueResponse) String() string { func (*GetValueResponse) ProtoMessage() {} func (x *GetValueResponse) ProtoReflect() protoreflect.Message { - mi := &file_settings_proto_msgTypes[9] + mi := &file_settings_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -604,7 +868,7 @@ func (x *GetValueResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetValueResponse.ProtoReflect.Descriptor instead. func (*GetValueResponse) Descriptor() ([]byte, []int) { - return file_settings_proto_rawDescGZIP(), []int{9} + return file_settings_proto_rawDescGZIP(), []int{12} } func (x *GetValueResponse) GetValue() *ValueWithIdentifier { @@ -626,7 +890,7 @@ type ListValuesRequest struct { func (x *ListValuesRequest) Reset() { *x = ListValuesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_settings_proto_msgTypes[10] + mi := &file_settings_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -639,7 +903,7 @@ func (x *ListValuesRequest) String() string { func (*ListValuesRequest) ProtoMessage() {} func (x *ListValuesRequest) ProtoReflect() protoreflect.Message { - mi := &file_settings_proto_msgTypes[10] + mi := &file_settings_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -652,7 +916,7 @@ func (x *ListValuesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListValuesRequest.ProtoReflect.Descriptor instead. func (*ListValuesRequest) Descriptor() ([]byte, []int) { - return file_settings_proto_rawDescGZIP(), []int{10} + return file_settings_proto_rawDescGZIP(), []int{13} } func (x *ListValuesRequest) GetBundleId() string { @@ -680,7 +944,7 @@ type ListValuesResponse struct { func (x *ListValuesResponse) Reset() { *x = ListValuesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_settings_proto_msgTypes[11] + mi := &file_settings_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -693,7 +957,7 @@ func (x *ListValuesResponse) String() string { func (*ListValuesResponse) ProtoMessage() {} func (x *ListValuesResponse) ProtoReflect() protoreflect.Message { - mi := &file_settings_proto_msgTypes[11] + mi := &file_settings_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -706,7 +970,7 @@ func (x *ListValuesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListValuesResponse.ProtoReflect.Descriptor instead. func (*ListValuesResponse) Descriptor() ([]byte, []int) { - return file_settings_proto_rawDescGZIP(), []int{11} + return file_settings_proto_rawDescGZIP(), []int{14} } func (x *ListValuesResponse) GetValues() []*ValueWithIdentifier { @@ -728,7 +992,7 @@ type GetValueByUniqueIdentifiersRequest struct { func (x *GetValueByUniqueIdentifiersRequest) Reset() { *x = GetValueByUniqueIdentifiersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_settings_proto_msgTypes[12] + mi := &file_settings_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -741,7 +1005,7 @@ func (x *GetValueByUniqueIdentifiersRequest) String() string { func (*GetValueByUniqueIdentifiersRequest) ProtoMessage() {} func (x *GetValueByUniqueIdentifiersRequest) ProtoReflect() protoreflect.Message { - mi := &file_settings_proto_msgTypes[12] + mi := &file_settings_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -754,7 +1018,7 @@ func (x *GetValueByUniqueIdentifiersRequest) ProtoReflect() protoreflect.Message // Deprecated: Use GetValueByUniqueIdentifiersRequest.ProtoReflect.Descriptor instead. func (*GetValueByUniqueIdentifiersRequest) Descriptor() ([]byte, []int) { - return file_settings_proto_rawDescGZIP(), []int{12} + return file_settings_proto_rawDescGZIP(), []int{15} } func (x *GetValueByUniqueIdentifiersRequest) GetAccountUuid() string { @@ -783,7 +1047,7 @@ type ValueWithIdentifier struct { func (x *ValueWithIdentifier) Reset() { *x = ValueWithIdentifier{} if protoimpl.UnsafeEnabled { - mi := &file_settings_proto_msgTypes[13] + mi := &file_settings_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -796,7 +1060,7 @@ func (x *ValueWithIdentifier) String() string { func (*ValueWithIdentifier) ProtoMessage() {} func (x *ValueWithIdentifier) ProtoReflect() protoreflect.Message { - mi := &file_settings_proto_msgTypes[13] + mi := &file_settings_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -809,7 +1073,7 @@ func (x *ValueWithIdentifier) ProtoReflect() protoreflect.Message { // Deprecated: Use ValueWithIdentifier.ProtoReflect.Descriptor instead. func (*ValueWithIdentifier) Descriptor() ([]byte, []int) { - return file_settings_proto_rawDescGZIP(), []int{13} + return file_settings_proto_rawDescGZIP(), []int{16} } func (x *ValueWithIdentifier) GetIdentifier() *Identifier { @@ -839,7 +1103,7 @@ type Identifier struct { func (x *Identifier) Reset() { *x = Identifier{} if protoimpl.UnsafeEnabled { - mi := &file_settings_proto_msgTypes[14] + mi := &file_settings_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -852,7 +1116,7 @@ func (x *Identifier) String() string { func (*Identifier) ProtoMessage() {} func (x *Identifier) ProtoReflect() protoreflect.Message { - mi := &file_settings_proto_msgTypes[14] + mi := &file_settings_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -865,7 +1129,7 @@ func (x *Identifier) ProtoReflect() protoreflect.Message { // Deprecated: Use Identifier.ProtoReflect.Descriptor instead. func (*Identifier) Descriptor() ([]byte, []int) { - return file_settings_proto_rawDescGZIP(), []int{14} + return file_settings_proto_rawDescGZIP(), []int{17} } func (x *Identifier) GetExtension() string { @@ -889,6 +1153,315 @@ func (x *Identifier) GetSetting() string { return "" } +type ListRoleAssignmentsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AccountUuid string `protobuf:"bytes,1,opt,name=account_uuid,json=accountUuid,proto3" json:"account_uuid,omitempty"` +} + +func (x *ListRoleAssignmentsRequest) Reset() { + *x = ListRoleAssignmentsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_settings_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListRoleAssignmentsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRoleAssignmentsRequest) ProtoMessage() {} + +func (x *ListRoleAssignmentsRequest) ProtoReflect() protoreflect.Message { + mi := &file_settings_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRoleAssignmentsRequest.ProtoReflect.Descriptor instead. +func (*ListRoleAssignmentsRequest) Descriptor() ([]byte, []int) { + return file_settings_proto_rawDescGZIP(), []int{18} +} + +func (x *ListRoleAssignmentsRequest) GetAccountUuid() string { + if x != nil { + return x.AccountUuid + } + return "" +} + +type ListRoleAssignmentsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Assignments []*UserRoleAssignment `protobuf:"bytes,1,rep,name=assignments,proto3" json:"assignments,omitempty"` +} + +func (x *ListRoleAssignmentsResponse) Reset() { + *x = ListRoleAssignmentsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_settings_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListRoleAssignmentsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRoleAssignmentsResponse) ProtoMessage() {} + +func (x *ListRoleAssignmentsResponse) ProtoReflect() protoreflect.Message { + mi := &file_settings_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRoleAssignmentsResponse.ProtoReflect.Descriptor instead. +func (*ListRoleAssignmentsResponse) Descriptor() ([]byte, []int) { + return file_settings_proto_rawDescGZIP(), []int{19} +} + +func (x *ListRoleAssignmentsResponse) GetAssignments() []*UserRoleAssignment { + if x != nil { + return x.Assignments + } + return nil +} + +type AssignRoleToUserRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AccountUuid string `protobuf:"bytes,1,opt,name=account_uuid,json=accountUuid,proto3" json:"account_uuid,omitempty"` + // the role_id is a bundle_id internally + RoleId string `protobuf:"bytes,2,opt,name=role_id,json=roleId,proto3" json:"role_id,omitempty"` +} + +func (x *AssignRoleToUserRequest) Reset() { + *x = AssignRoleToUserRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_settings_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AssignRoleToUserRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AssignRoleToUserRequest) ProtoMessage() {} + +func (x *AssignRoleToUserRequest) ProtoReflect() protoreflect.Message { + mi := &file_settings_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AssignRoleToUserRequest.ProtoReflect.Descriptor instead. +func (*AssignRoleToUserRequest) Descriptor() ([]byte, []int) { + return file_settings_proto_rawDescGZIP(), []int{20} +} + +func (x *AssignRoleToUserRequest) GetAccountUuid() string { + if x != nil { + return x.AccountUuid + } + return "" +} + +func (x *AssignRoleToUserRequest) GetRoleId() string { + if x != nil { + return x.RoleId + } + return "" +} + +type AssignRoleToUserResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Assignment *UserRoleAssignment `protobuf:"bytes,1,opt,name=assignment,proto3" json:"assignment,omitempty"` +} + +func (x *AssignRoleToUserResponse) Reset() { + *x = AssignRoleToUserResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_settings_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AssignRoleToUserResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AssignRoleToUserResponse) ProtoMessage() {} + +func (x *AssignRoleToUserResponse) ProtoReflect() protoreflect.Message { + mi := &file_settings_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AssignRoleToUserResponse.ProtoReflect.Descriptor instead. +func (*AssignRoleToUserResponse) Descriptor() ([]byte, []int) { + return file_settings_proto_rawDescGZIP(), []int{21} +} + +func (x *AssignRoleToUserResponse) GetAssignment() *UserRoleAssignment { + if x != nil { + return x.Assignment + } + return nil +} + +type RemoveRoleFromUserRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *RemoveRoleFromUserRequest) Reset() { + *x = RemoveRoleFromUserRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_settings_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RemoveRoleFromUserRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveRoleFromUserRequest) ProtoMessage() {} + +func (x *RemoveRoleFromUserRequest) ProtoReflect() protoreflect.Message { + mi := &file_settings_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoveRoleFromUserRequest.ProtoReflect.Descriptor instead. +func (*RemoveRoleFromUserRequest) Descriptor() ([]byte, []int) { + return file_settings_proto_rawDescGZIP(), []int{22} +} + +func (x *RemoveRoleFromUserRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +type UserRoleAssignment struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // id is generated upon saving the assignment + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + AccountUuid string `protobuf:"bytes,2,opt,name=account_uuid,json=accountUuid,proto3" json:"account_uuid,omitempty"` + // the role_id is a bundle_id internally + RoleId string `protobuf:"bytes,3,opt,name=role_id,json=roleId,proto3" json:"role_id,omitempty"` +} + +func (x *UserRoleAssignment) Reset() { + *x = UserRoleAssignment{} + if protoimpl.UnsafeEnabled { + mi := &file_settings_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserRoleAssignment) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserRoleAssignment) ProtoMessage() {} + +func (x *UserRoleAssignment) ProtoReflect() protoreflect.Message { + mi := &file_settings_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserRoleAssignment.ProtoReflect.Descriptor instead. +func (*UserRoleAssignment) Descriptor() ([]byte, []int) { + return file_settings_proto_rawDescGZIP(), []int{23} +} + +func (x *UserRoleAssignment) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *UserRoleAssignment) GetAccountUuid() string { + if x != nil { + return x.AccountUuid + } + return "" +} + +func (x *UserRoleAssignment) GetRoleId() string { + if x != nil { + return x.RoleId + } + return "" +} + type Resource struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -901,7 +1474,7 @@ type Resource struct { func (x *Resource) Reset() { *x = Resource{} if protoimpl.UnsafeEnabled { - mi := &file_settings_proto_msgTypes[15] + mi := &file_settings_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -914,7 +1487,7 @@ func (x *Resource) String() string { func (*Resource) ProtoMessage() {} func (x *Resource) ProtoReflect() protoreflect.Message { - mi := &file_settings_proto_msgTypes[15] + mi := &file_settings_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -927,7 +1500,7 @@ func (x *Resource) ProtoReflect() protoreflect.Message { // Deprecated: Use Resource.ProtoReflect.Descriptor instead. func (*Resource) Descriptor() ([]byte, []int) { - return file_settings_proto_rawDescGZIP(), []int{15} + return file_settings_proto_rawDescGZIP(), []int{24} } func (x *Resource) GetType() Resource_Type { @@ -961,7 +1534,7 @@ type Bundle struct { func (x *Bundle) Reset() { *x = Bundle{} if protoimpl.UnsafeEnabled { - mi := &file_settings_proto_msgTypes[16] + mi := &file_settings_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -974,7 +1547,7 @@ func (x *Bundle) String() string { func (*Bundle) ProtoMessage() {} func (x *Bundle) ProtoReflect() protoreflect.Message { - mi := &file_settings_proto_msgTypes[16] + mi := &file_settings_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -987,7 +1560,7 @@ func (x *Bundle) ProtoReflect() protoreflect.Message { // Deprecated: Use Bundle.ProtoReflect.Descriptor instead. func (*Bundle) Descriptor() ([]byte, []int) { - return file_settings_proto_rawDescGZIP(), []int{16} + return file_settings_proto_rawDescGZIP(), []int{25} } func (x *Bundle) GetId() string { @@ -1054,6 +1627,7 @@ type Setting struct { // *Setting_BoolValue // *Setting_SingleChoiceValue // *Setting_MultiChoiceValue + // *Setting_PermissionValue Value isSetting_Value `protobuf_oneof:"value"` Resource *Resource `protobuf:"bytes,11,opt,name=resource,proto3" json:"resource,omitempty"` } @@ -1061,7 +1635,7 @@ type Setting struct { func (x *Setting) Reset() { *x = Setting{} if protoimpl.UnsafeEnabled { - mi := &file_settings_proto_msgTypes[17] + mi := &file_settings_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1074,7 +1648,7 @@ func (x *Setting) String() string { func (*Setting) ProtoMessage() {} func (x *Setting) ProtoReflect() protoreflect.Message { - mi := &file_settings_proto_msgTypes[17] + mi := &file_settings_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1087,7 +1661,7 @@ func (x *Setting) ProtoReflect() protoreflect.Message { // Deprecated: Use Setting.ProtoReflect.Descriptor instead. func (*Setting) Descriptor() ([]byte, []int) { - return file_settings_proto_rawDescGZIP(), []int{17} + return file_settings_proto_rawDescGZIP(), []int{26} } func (x *Setting) GetId() string { @@ -1160,6 +1734,13 @@ func (x *Setting) GetMultiChoiceValue() *MultiChoiceList { return nil } +func (x *Setting) GetPermissionValue() *Permission { + if x, ok := x.GetValue().(*Setting_PermissionValue); ok { + return x.PermissionValue + } + return nil +} + func (x *Setting) GetResource() *Resource { if x != nil { return x.Resource @@ -1191,6 +1772,10 @@ type Setting_MultiChoiceValue struct { MultiChoiceValue *MultiChoiceList `protobuf:"bytes,9,opt,name=multi_choice_value,json=multiChoiceValue,proto3,oneof"` } +type Setting_PermissionValue struct { + PermissionValue *Permission `protobuf:"bytes,10,opt,name=permission_value,json=permissionValue,proto3,oneof"` +} + func (*Setting_IntValue) isSetting_Value() {} func (*Setting_StringValue) isSetting_Value() {} @@ -1201,6 +1786,8 @@ func (*Setting_SingleChoiceValue) isSetting_Value() {} func (*Setting_MultiChoiceValue) isSetting_Value() {} +func (*Setting_PermissionValue) isSetting_Value() {} + type Int struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1216,7 +1803,7 @@ type Int struct { func (x *Int) Reset() { *x = Int{} if protoimpl.UnsafeEnabled { - mi := &file_settings_proto_msgTypes[18] + mi := &file_settings_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1229,7 +1816,7 @@ func (x *Int) String() string { func (*Int) ProtoMessage() {} func (x *Int) ProtoReflect() protoreflect.Message { - mi := &file_settings_proto_msgTypes[18] + mi := &file_settings_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1242,7 +1829,7 @@ func (x *Int) ProtoReflect() protoreflect.Message { // Deprecated: Use Int.ProtoReflect.Descriptor instead. func (*Int) Descriptor() ([]byte, []int) { - return file_settings_proto_rawDescGZIP(), []int{18} + return file_settings_proto_rawDescGZIP(), []int{27} } func (x *Int) GetDefault() int64 { @@ -1295,7 +1882,7 @@ type String struct { func (x *String) Reset() { *x = String{} if protoimpl.UnsafeEnabled { - mi := &file_settings_proto_msgTypes[19] + mi := &file_settings_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1308,7 +1895,7 @@ func (x *String) String() string { func (*String) ProtoMessage() {} func (x *String) ProtoReflect() protoreflect.Message { - mi := &file_settings_proto_msgTypes[19] + mi := &file_settings_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1321,7 +1908,7 @@ func (x *String) ProtoReflect() protoreflect.Message { // Deprecated: Use String.ProtoReflect.Descriptor instead. func (*String) Descriptor() ([]byte, []int) { - return file_settings_proto_rawDescGZIP(), []int{19} + return file_settings_proto_rawDescGZIP(), []int{28} } func (x *String) GetDefault() string { @@ -1371,7 +1958,7 @@ type Bool struct { func (x *Bool) Reset() { *x = Bool{} if protoimpl.UnsafeEnabled { - mi := &file_settings_proto_msgTypes[20] + mi := &file_settings_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1384,7 +1971,7 @@ func (x *Bool) String() string { func (*Bool) ProtoMessage() {} func (x *Bool) ProtoReflect() protoreflect.Message { - mi := &file_settings_proto_msgTypes[20] + mi := &file_settings_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1397,7 +1984,7 @@ func (x *Bool) ProtoReflect() protoreflect.Message { // Deprecated: Use Bool.ProtoReflect.Descriptor instead. func (*Bool) Descriptor() ([]byte, []int) { - return file_settings_proto_rawDescGZIP(), []int{20} + return file_settings_proto_rawDescGZIP(), []int{29} } func (x *Bool) GetDefault() bool { @@ -1425,7 +2012,7 @@ type SingleChoiceList struct { func (x *SingleChoiceList) Reset() { *x = SingleChoiceList{} if protoimpl.UnsafeEnabled { - mi := &file_settings_proto_msgTypes[21] + mi := &file_settings_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1438,7 +2025,7 @@ func (x *SingleChoiceList) String() string { func (*SingleChoiceList) ProtoMessage() {} func (x *SingleChoiceList) ProtoReflect() protoreflect.Message { - mi := &file_settings_proto_msgTypes[21] + mi := &file_settings_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1451,7 +2038,7 @@ func (x *SingleChoiceList) ProtoReflect() protoreflect.Message { // Deprecated: Use SingleChoiceList.ProtoReflect.Descriptor instead. func (*SingleChoiceList) Descriptor() ([]byte, []int) { - return file_settings_proto_rawDescGZIP(), []int{21} + return file_settings_proto_rawDescGZIP(), []int{30} } func (x *SingleChoiceList) GetOptions() []*ListOption { @@ -1472,7 +2059,7 @@ type MultiChoiceList struct { func (x *MultiChoiceList) Reset() { *x = MultiChoiceList{} if protoimpl.UnsafeEnabled { - mi := &file_settings_proto_msgTypes[22] + mi := &file_settings_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1485,7 +2072,7 @@ func (x *MultiChoiceList) String() string { func (*MultiChoiceList) ProtoMessage() {} func (x *MultiChoiceList) ProtoReflect() protoreflect.Message { - mi := &file_settings_proto_msgTypes[22] + mi := &file_settings_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1498,7 +2085,7 @@ func (x *MultiChoiceList) ProtoReflect() protoreflect.Message { // Deprecated: Use MultiChoiceList.ProtoReflect.Descriptor instead. func (*MultiChoiceList) Descriptor() ([]byte, []int) { - return file_settings_proto_rawDescGZIP(), []int{22} + return file_settings_proto_rawDescGZIP(), []int{31} } func (x *MultiChoiceList) GetOptions() []*ListOption { @@ -1521,7 +2108,7 @@ type ListOption struct { func (x *ListOption) Reset() { *x = ListOption{} if protoimpl.UnsafeEnabled { - mi := &file_settings_proto_msgTypes[23] + mi := &file_settings_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1534,7 +2121,7 @@ func (x *ListOption) String() string { func (*ListOption) ProtoMessage() {} func (x *ListOption) ProtoReflect() protoreflect.Message { - mi := &file_settings_proto_msgTypes[23] + mi := &file_settings_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1547,7 +2134,7 @@ func (x *ListOption) ProtoReflect() protoreflect.Message { // Deprecated: Use ListOption.ProtoReflect.Descriptor instead. func (*ListOption) Descriptor() ([]byte, []int) { - return file_settings_proto_rawDescGZIP(), []int{23} + return file_settings_proto_rawDescGZIP(), []int{32} } func (x *ListOption) GetValue() *ListOptionValue { @@ -1571,6 +2158,61 @@ func (x *ListOption) GetDisplayValue() string { return "" } +type Permission struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Operation Permission_Operation `protobuf:"varint,1,opt,name=operation,proto3,enum=proto.Permission_Operation" json:"operation,omitempty"` + Constraint Permission_Constraint `protobuf:"varint,2,opt,name=constraint,proto3,enum=proto.Permission_Constraint" json:"constraint,omitempty"` +} + +func (x *Permission) Reset() { + *x = Permission{} + if protoimpl.UnsafeEnabled { + mi := &file_settings_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Permission) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Permission) ProtoMessage() {} + +func (x *Permission) ProtoReflect() protoreflect.Message { + mi := &file_settings_proto_msgTypes[33] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Permission.ProtoReflect.Descriptor instead. +func (*Permission) Descriptor() ([]byte, []int) { + return file_settings_proto_rawDescGZIP(), []int{33} +} + +func (x *Permission) GetOperation() Permission_Operation { + if x != nil { + return x.Operation + } + return Permission_OPERATION_UNKNOWN +} + +func (x *Permission) GetConstraint() Permission_Constraint { + if x != nil { + return x.Constraint + } + return Permission_CONSTRAINT_UNKNOWN +} + type Value struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1594,7 +2236,7 @@ type Value struct { func (x *Value) Reset() { *x = Value{} if protoimpl.UnsafeEnabled { - mi := &file_settings_proto_msgTypes[24] + mi := &file_settings_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1607,7 +2249,7 @@ func (x *Value) String() string { func (*Value) ProtoMessage() {} func (x *Value) ProtoReflect() protoreflect.Message { - mi := &file_settings_proto_msgTypes[24] + mi := &file_settings_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1620,7 +2262,7 @@ func (x *Value) ProtoReflect() protoreflect.Message { // Deprecated: Use Value.ProtoReflect.Descriptor instead. func (*Value) Descriptor() ([]byte, []int) { - return file_settings_proto_rawDescGZIP(), []int{24} + return file_settings_proto_rawDescGZIP(), []int{34} } func (x *Value) GetId() string { @@ -1732,7 +2374,7 @@ type ListValue struct { func (x *ListValue) Reset() { *x = ListValue{} if protoimpl.UnsafeEnabled { - mi := &file_settings_proto_msgTypes[25] + mi := &file_settings_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1745,7 +2387,7 @@ func (x *ListValue) String() string { func (*ListValue) ProtoMessage() {} func (x *ListValue) ProtoReflect() protoreflect.Message { - mi := &file_settings_proto_msgTypes[25] + mi := &file_settings_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1758,7 +2400,7 @@ func (x *ListValue) ProtoReflect() protoreflect.Message { // Deprecated: Use ListValue.ProtoReflect.Descriptor instead. func (*ListValue) Descriptor() ([]byte, []int) { - return file_settings_proto_rawDescGZIP(), []int{25} + return file_settings_proto_rawDescGZIP(), []int{35} } func (x *ListValue) GetValues() []*ListOptionValue { @@ -1782,7 +2424,7 @@ type ListOptionValue struct { func (x *ListOptionValue) Reset() { *x = ListOptionValue{} if protoimpl.UnsafeEnabled { - mi := &file_settings_proto_msgTypes[26] + mi := &file_settings_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1795,7 +2437,7 @@ func (x *ListOptionValue) String() string { func (*ListOptionValue) ProtoMessage() {} func (x *ListOptionValue) ProtoReflect() protoreflect.Message { - mi := &file_settings_proto_msgTypes[26] + mi := &file_settings_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1808,7 +2450,7 @@ func (x *ListOptionValue) ProtoReflect() protoreflect.Message { // Deprecated: Use ListOptionValue.ProtoReflect.Descriptor instead. func (*ListOptionValue) Descriptor() ([]byte, []int) { - return file_settings_proto_rawDescGZIP(), []int{26} + return file_settings_proto_rawDescGZIP(), []int{36} } func (m *ListOptionValue) GetOption() isListOptionValue_Option { @@ -1857,252 +2499,377 @@ var file_settings_proto_rawDesc = []byte{ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x22, 0x3a, 0x0a, 0x11, 0x53, 0x61, 0x76, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x06, 0x62, 0x75, 0x6e, 0x64, - 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x06, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x22, - 0x3b, 0x0a, 0x12, 0x53, 0x61, 0x76, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x06, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x18, + 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x22, 0x3a, 0x0a, 0x11, 0x53, 0x61, 0x76, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x06, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x42, 0x75, - 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x06, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x2f, 0x0a, 0x10, - 0x47, 0x65, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x3a, 0x0a, - 0x11, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x06, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x3b, 0x0a, 0x12, + 0x53, 0x61, 0x76, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x06, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x42, 0x75, 0x6e, 0x64, 0x6c, - 0x65, 0x52, 0x06, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x37, 0x0a, 0x12, 0x4c, 0x69, 0x73, - 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x75, - 0x69, 0x64, 0x22, 0x3e, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x07, 0x62, 0x75, 0x6e, - 0x64, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x07, 0x62, 0x75, 0x6e, 0x64, 0x6c, - 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x53, 0x61, 0x76, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x45, 0x0a, 0x11, 0x53, 0x61, - 0x76, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x65, 0x52, 0x06, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x2f, 0x0a, 0x10, 0x47, 0x65, 0x74, + 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x3a, 0x0a, 0x11, 0x47, 0x65, + 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x25, 0x0a, 0x06, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x06, + 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x37, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, + 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x75, 0x69, 0x64, 0x22, + 0x3e, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x07, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x07, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x22, + 0x62, 0x0a, 0x19, 0x41, 0x64, 0x64, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x42, + 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x07, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x22, 0x46, 0x0a, 0x1a, 0x41, 0x64, 0x64, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x54, 0x6f, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x28, 0x0a, 0x07, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x52, 0x07, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x5c, 0x0a, 0x1e, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, + 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x22, 0x36, 0x0a, 0x10, 0x53, 0x61, 0x76, + 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x45, 0x0a, 0x11, 0x53, 0x61, 0x76, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x57, 0x69, 0x74, 0x68, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x21, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x44, 0x0a, 0x10, 0x47, + 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x57, 0x69, 0x74, 0x68, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0x21, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x22, 0x44, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x57, 0x69, 0x74, 0x68, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x53, 0x0a, 0x11, 0x4c, 0x69, - 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x75, 0x69, 0x64, 0x22, - 0x48, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x57, 0x69, 0x74, 0x68, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x66, 0x0a, 0x22, 0x47, 0x65, 0x74, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x79, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x75, - 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x49, - 0x64, 0x22, 0x6c, 0x0a, 0x13, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x57, 0x69, 0x74, 0x68, 0x49, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x31, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, - 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, - 0x5c, 0x0a, 0x0a, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x1c, 0x0a, - 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x62, - 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x6e, - 0x64, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x22, 0xd1, 0x01, - 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x22, 0x8a, 0x01, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, - 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, - 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x10, 0x01, - 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x02, 0x12, - 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x48, 0x41, 0x52, 0x45, 0x10, 0x03, 0x12, - 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x10, - 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x55, 0x4e, 0x44, 0x4c, 0x45, - 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x10, - 0x06, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, - 0x07, 0x22, 0xa9, 0x02, 0x0a, 0x06, 0x42, 0x75, 0x6e, 0x64, 0x6c, 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, 0x26, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, - 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, - 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x08, 0x73, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x73, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x22, 0x39, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x0d, - 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x02, 0x22, 0xc8, 0x03, - 0x0a, 0x07, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 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, 0x21, 0x0a, - 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x49, 0x6e, - 0x74, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, - 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x2c, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x42, 0x6f, - 0x6f, 0x6c, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x49, 0x0a, 0x13, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, - 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x43, 0x68, 0x6f, 0x69, 0x63, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x11, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x43, - 0x68, 0x6f, 0x69, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x46, 0x0a, 0x12, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x5f, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4d, - 0x75, 0x6c, 0x74, 0x69, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, - 0x52, 0x10, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x2b, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, - 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x79, 0x0a, 0x03, 0x49, 0x6e, 0x74, 0x12, - 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6d, - 0x61, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x12, 0x0a, - 0x04, 0x73, 0x74, 0x65, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x74, 0x65, - 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, - 0x64, 0x65, 0x72, 0x22, 0x9e, 0x01, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x18, - 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6d, 0x69, 0x6e, 0x4c, 0x65, 0x6e, - 0x67, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, - 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, + 0x65, 0x22, 0x53, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x6e, 0x64, 0x6c, + 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x75, + 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x55, 0x75, 0x69, 0x64, 0x22, 0x48, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x06, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x57, 0x69, 0x74, 0x68, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x22, 0x66, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x79, 0x55, 0x6e, + 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x22, 0x6c, 0x0a, 0x13, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x57, 0x69, 0x74, 0x68, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, + 0x31, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x12, 0x22, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5c, 0x0a, 0x0a, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x22, 0x3f, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, + 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x75, 0x75, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x55, 0x75, 0x69, 0x64, 0x22, 0x5a, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x22, 0x55, 0x0a, 0x17, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x54, + 0x6f, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x75, 0x69, 0x64, 0x12, + 0x17, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x72, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x55, 0x0a, 0x18, 0x41, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x22, + 0x2b, 0x0a, 0x19, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x46, 0x72, 0x6f, + 0x6d, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x60, 0x0a, 0x12, + 0x55, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x75, 0x75, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x55, 0x75, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x22, 0xd1, + 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x8a, 0x01, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, + 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, + 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x10, + 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x02, + 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x48, 0x41, 0x52, 0x45, 0x10, 0x03, + 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, + 0x10, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x55, 0x4e, 0x44, 0x4c, + 0x45, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x53, 0x45, 0x52, + 0x10, 0x06, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, + 0x10, 0x07, 0x22, 0xa9, 0x02, 0x0a, 0x06, 0x42, 0x75, 0x6e, 0x64, 0x6c, 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, 0x26, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x12, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, + 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x08, 0x73, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x73, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x22, 0x39, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x10, 0x0a, + 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x01, 0x12, + 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x02, 0x22, 0x88, + 0x04, 0x0a, 0x07, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 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, 0x21, + 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x49, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, + 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x2c, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x42, + 0x6f, 0x6f, 0x6c, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x49, 0x0a, 0x13, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x6f, 0x69, 0x63, + 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x43, 0x68, 0x6f, 0x69, + 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x11, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, + 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x46, 0x0a, 0x12, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x48, + 0x00, 0x52, 0x10, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x3e, 0x0a, 0x10, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x48, 0x00, 0x52, 0x0f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x2b, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x79, 0x0a, 0x03, 0x49, 0x6e, 0x74, + 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, + 0x6d, 0x61, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x12, + 0x0a, 0x04, 0x73, 0x74, 0x65, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x74, + 0x65, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, - 0x6c, 0x64, 0x65, 0x72, 0x22, 0x36, 0x0a, 0x04, 0x42, 0x6f, 0x6f, 0x6c, 0x12, 0x18, 0x0a, 0x07, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3f, 0x0a, 0x10, - 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0x2b, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3e, 0x0a, - 0x0f, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0x2b, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x79, 0x0a, - 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x69, 0x73, 0x70, - 0x6c, 0x61, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xc4, 0x02, 0x0a, 0x05, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x49, 0x64, 0x12, - 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x21, - 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x75, 0x69, - 0x64, 0x12, 0x2b, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1f, - 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x1d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x03, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, - 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x31, 0x0a, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x69, 0x73, - 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, - 0x3b, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2e, 0x0a, 0x06, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x5f, 0x0a, 0x0f, - 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x32, 0xd3, 0x02, - 0x0a, 0x0d, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x6a, 0x0a, 0x0a, 0x53, 0x61, 0x76, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x18, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x53, 0x61, 0x76, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x22, 0x1c, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x76, 0x30, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x62, 0x75, 0x6e, - 0x64, 0x6c, 0x65, 0x2d, 0x73, 0x61, 0x76, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x66, 0x0a, 0x09, 0x47, - 0x65, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6e, - 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x73, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2d, 0x67, 0x65, 0x74, - 0x3a, 0x01, 0x2a, 0x12, 0x6e, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, - 0x65, 0x73, 0x12, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, - 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x22, 0x22, 0x1d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x2f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x2d, 0x6c, 0x69, 0x73, 0x74, - 0x3a, 0x01, 0x2a, 0x32, 0xe8, 0x03, 0x0a, 0x0c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x66, 0x0a, 0x09, 0x53, 0x61, 0x76, 0x65, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x2d, 0x73, 0x61, 0x76, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, 0x08, - 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1f, 0x22, 0x1a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2d, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, - 0x12, 0x6a, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x18, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x22, 0x1c, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x9f, 0x01, 0x0a, - 0x1b, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x79, 0x55, 0x6e, 0x69, 0x71, 0x75, - 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x29, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x79, 0x55, + 0x6c, 0x64, 0x65, 0x72, 0x22, 0x9e, 0x01, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, + 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6d, 0x69, 0x6e, 0x4c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, + 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, + 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x22, 0x36, 0x0a, 0x04, 0x42, 0x6f, 0x6f, 0x6c, 0x12, 0x18, 0x0a, + 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3f, 0x0a, + 0x10, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, + 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3e, + 0x0a, 0x0f, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, + 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x79, + 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xe4, 0x02, 0x0a, 0x0a, 0x50, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x74, + 0x72, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, + 0x74, 0x22, 0x78, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, + 0x0a, 0x11, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, + 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x4f, + 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x10, 0x02, 0x12, + 0x14, 0x0a, 0x10, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x44, + 0x41, 0x54, 0x45, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x04, 0x22, 0x63, 0x0a, 0x0a, 0x43, + 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x4f, 0x4e, + 0x53, 0x54, 0x52, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, + 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x52, 0x41, 0x49, 0x4e, 0x54, 0x5f, + 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x52, 0x41, + 0x49, 0x4e, 0x54, 0x5f, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, + 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x52, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x41, 0x4c, 0x4c, 0x10, 0x03, + 0x22, 0xc4, 0x02, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, + 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, + 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x75, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x08, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, + 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, + 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x31, 0x0a, 0x0a, 0x6c, + 0x69, 0x73, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3b, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x22, 0x5f, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1d, 0x0a, 0x09, + 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, + 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x32, 0xef, 0x04, 0x0a, 0x0d, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6a, 0x0a, 0x0a, 0x53, 0x61, 0x76, 0x65, 0x42, + 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x61, + 0x76, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x42, 0x75, 0x6e, 0x64, + 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x21, 0x22, 0x1c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2d, 0x73, 0x61, 0x76, 0x65, + 0x3a, 0x01, 0x2a, 0x12, 0x66, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, + 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6e, 0x64, + 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x62, 0x75, + 0x6e, 0x64, 0x6c, 0x65, 0x2d, 0x67, 0x65, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x6e, 0x0a, 0x0b, 0x4c, + 0x69, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x12, 0x19, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x22, 0x1d, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x30, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x62, 0x75, 0x6e, 0x64, + 0x6c, 0x65, 0x73, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x8a, 0x01, 0x0a, 0x12, + 0x41, 0x64, 0x64, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x42, 0x75, 0x6e, 0x64, + 0x6c, 0x65, 0x12, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x64, 0x64, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x64, 0x64, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x22, + 0x24, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x2f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x2d, 0x61, 0x64, 0x64, 0x2d, 0x73, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x3a, 0x01, 0x2a, 0x12, 0x8c, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x75, + 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x75, + 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x22, 0x27, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x62, 0x75, + 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x2d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x2d, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x3a, 0x01, 0x2a, 0x32, 0xe8, 0x03, 0x0a, 0x0c, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x66, 0x0a, 0x09, 0x53, 0x61, 0x76, 0x65, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x61, + 0x76, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, + 0x22, 0x1b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x2f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2d, 0x73, 0x61, 0x76, 0x65, 0x3a, 0x01, 0x2a, + 0x12, 0x62, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x16, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x22, 0x1a, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x73, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2d, 0x67, 0x65, + 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x6a, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x22, + 0x1c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x2f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, + 0x12, 0x9f, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x79, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x22, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, - 0x30, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x2d, 0x67, 0x65, 0x74, 0x2d, 0x62, 0x79, 0x2d, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x2d, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x3a, 0x01, 0x2a, 0x42, 0xba, + 0x12, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x42, 0x79, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x22, 0x31, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2d, 0x67, 0x65, 0x74, 0x2d, 0x62, 0x79, 0x2d, 0x75, 0x6e, 0x69, + 0x71, 0x75, 0x65, 0x2d, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x3a, + 0x01, 0x2a, 0x32, 0x89, 0x04, 0x0a, 0x0b, 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x6a, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, + 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x22, 0x1b, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x8a, + 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x22, 0x21, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x30, 0x2f, 0x73, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x80, 0x01, 0x0a, 0x10, + 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, + 0x12, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, + 0x6f, 0x6c, 0x65, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, + 0x6f, 0x6c, 0x65, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x30, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x61, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2d, 0x61, 0x64, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0x7e, + 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x46, 0x72, 0x6f, 0x6d, + 0x55, 0x73, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x73, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x22, 0x23, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x30, 0x2f, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x3a, 0x01, 0x2a, 0x42, 0xba, 0x02, 0x5a, 0x12, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x30, 0x3b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x92, 0x41, 0xa2, 0x02, 0x12, 0xae, 0x01, 0x0a, 0x08, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x50, 0x0a, 0x0d, 0x6f, 0x77, 0x6e, 0x43, 0x6c, 0x6f, @@ -2138,85 +2905,117 @@ func file_settings_proto_rawDescGZIP() []byte { return file_settings_proto_rawDescData } -var file_settings_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_settings_proto_msgTypes = make([]protoimpl.MessageInfo, 27) +var file_settings_proto_enumTypes = make([]protoimpl.EnumInfo, 4) +var file_settings_proto_msgTypes = make([]protoimpl.MessageInfo, 37) var file_settings_proto_goTypes = []interface{}{ (Resource_Type)(0), // 0: proto.Resource.Type (Bundle_Type)(0), // 1: proto.Bundle.Type - (*SaveBundleRequest)(nil), // 2: proto.SaveBundleRequest - (*SaveBundleResponse)(nil), // 3: proto.SaveBundleResponse - (*GetBundleRequest)(nil), // 4: proto.GetBundleRequest - (*GetBundleResponse)(nil), // 5: proto.GetBundleResponse - (*ListBundlesRequest)(nil), // 6: proto.ListBundlesRequest - (*ListBundlesResponse)(nil), // 7: proto.ListBundlesResponse - (*SaveValueRequest)(nil), // 8: proto.SaveValueRequest - (*SaveValueResponse)(nil), // 9: proto.SaveValueResponse - (*GetValueRequest)(nil), // 10: proto.GetValueRequest - (*GetValueResponse)(nil), // 11: proto.GetValueResponse - (*ListValuesRequest)(nil), // 12: proto.ListValuesRequest - (*ListValuesResponse)(nil), // 13: proto.ListValuesResponse - (*GetValueByUniqueIdentifiersRequest)(nil), // 14: proto.GetValueByUniqueIdentifiersRequest - (*ValueWithIdentifier)(nil), // 15: proto.ValueWithIdentifier - (*Identifier)(nil), // 16: proto.Identifier - (*Resource)(nil), // 17: proto.Resource - (*Bundle)(nil), // 18: proto.Bundle - (*Setting)(nil), // 19: proto.Setting - (*Int)(nil), // 20: proto.Int - (*String)(nil), // 21: proto.String - (*Bool)(nil), // 22: proto.Bool - (*SingleChoiceList)(nil), // 23: proto.SingleChoiceList - (*MultiChoiceList)(nil), // 24: proto.MultiChoiceList - (*ListOption)(nil), // 25: proto.ListOption - (*Value)(nil), // 26: proto.Value - (*ListValue)(nil), // 27: proto.ListValue - (*ListOptionValue)(nil), // 28: proto.ListOptionValue + (Permission_Operation)(0), // 2: proto.Permission.Operation + (Permission_Constraint)(0), // 3: proto.Permission.Constraint + (*SaveBundleRequest)(nil), // 4: proto.SaveBundleRequest + (*SaveBundleResponse)(nil), // 5: proto.SaveBundleResponse + (*GetBundleRequest)(nil), // 6: proto.GetBundleRequest + (*GetBundleResponse)(nil), // 7: proto.GetBundleResponse + (*ListBundlesRequest)(nil), // 8: proto.ListBundlesRequest + (*ListBundlesResponse)(nil), // 9: proto.ListBundlesResponse + (*AddSettingToBundleRequest)(nil), // 10: proto.AddSettingToBundleRequest + (*AddSettingToBundleResponse)(nil), // 11: proto.AddSettingToBundleResponse + (*RemoveSettingFromBundleRequest)(nil), // 12: proto.RemoveSettingFromBundleRequest + (*SaveValueRequest)(nil), // 13: proto.SaveValueRequest + (*SaveValueResponse)(nil), // 14: proto.SaveValueResponse + (*GetValueRequest)(nil), // 15: proto.GetValueRequest + (*GetValueResponse)(nil), // 16: proto.GetValueResponse + (*ListValuesRequest)(nil), // 17: proto.ListValuesRequest + (*ListValuesResponse)(nil), // 18: proto.ListValuesResponse + (*GetValueByUniqueIdentifiersRequest)(nil), // 19: proto.GetValueByUniqueIdentifiersRequest + (*ValueWithIdentifier)(nil), // 20: proto.ValueWithIdentifier + (*Identifier)(nil), // 21: proto.Identifier + (*ListRoleAssignmentsRequest)(nil), // 22: proto.ListRoleAssignmentsRequest + (*ListRoleAssignmentsResponse)(nil), // 23: proto.ListRoleAssignmentsResponse + (*AssignRoleToUserRequest)(nil), // 24: proto.AssignRoleToUserRequest + (*AssignRoleToUserResponse)(nil), // 25: proto.AssignRoleToUserResponse + (*RemoveRoleFromUserRequest)(nil), // 26: proto.RemoveRoleFromUserRequest + (*UserRoleAssignment)(nil), // 27: proto.UserRoleAssignment + (*Resource)(nil), // 28: proto.Resource + (*Bundle)(nil), // 29: proto.Bundle + (*Setting)(nil), // 30: proto.Setting + (*Int)(nil), // 31: proto.Int + (*String)(nil), // 32: proto.String + (*Bool)(nil), // 33: proto.Bool + (*SingleChoiceList)(nil), // 34: proto.SingleChoiceList + (*MultiChoiceList)(nil), // 35: proto.MultiChoiceList + (*ListOption)(nil), // 36: proto.ListOption + (*Permission)(nil), // 37: proto.Permission + (*Value)(nil), // 38: proto.Value + (*ListValue)(nil), // 39: proto.ListValue + (*ListOptionValue)(nil), // 40: proto.ListOptionValue + (*empty.Empty)(nil), // 41: google.protobuf.Empty } var file_settings_proto_depIdxs = []int32{ - 18, // 0: proto.SaveBundleRequest.bundle:type_name -> proto.Bundle - 18, // 1: proto.SaveBundleResponse.bundle:type_name -> proto.Bundle - 18, // 2: proto.GetBundleResponse.bundle:type_name -> proto.Bundle - 18, // 3: proto.ListBundlesResponse.bundles:type_name -> proto.Bundle - 26, // 4: proto.SaveValueRequest.value:type_name -> proto.Value - 15, // 5: proto.SaveValueResponse.value:type_name -> proto.ValueWithIdentifier - 15, // 6: proto.GetValueResponse.value:type_name -> proto.ValueWithIdentifier - 15, // 7: proto.ListValuesResponse.values:type_name -> proto.ValueWithIdentifier - 16, // 8: proto.ValueWithIdentifier.identifier:type_name -> proto.Identifier - 26, // 9: proto.ValueWithIdentifier.value:type_name -> proto.Value - 0, // 10: proto.Resource.type:type_name -> proto.Resource.Type - 1, // 11: proto.Bundle.type:type_name -> proto.Bundle.Type - 19, // 12: proto.Bundle.settings:type_name -> proto.Setting - 17, // 13: proto.Bundle.resource:type_name -> proto.Resource - 20, // 14: proto.Setting.int_value:type_name -> proto.Int - 21, // 15: proto.Setting.string_value:type_name -> proto.String - 22, // 16: proto.Setting.bool_value:type_name -> proto.Bool - 23, // 17: proto.Setting.single_choice_value:type_name -> proto.SingleChoiceList - 24, // 18: proto.Setting.multi_choice_value:type_name -> proto.MultiChoiceList - 17, // 19: proto.Setting.resource:type_name -> proto.Resource - 25, // 20: proto.SingleChoiceList.options:type_name -> proto.ListOption - 25, // 21: proto.MultiChoiceList.options:type_name -> proto.ListOption - 28, // 22: proto.ListOption.value:type_name -> proto.ListOptionValue - 17, // 23: proto.Value.resource:type_name -> proto.Resource - 27, // 24: proto.Value.list_value:type_name -> proto.ListValue - 28, // 25: proto.ListValue.values:type_name -> proto.ListOptionValue - 2, // 26: proto.BundleService.SaveBundle:input_type -> proto.SaveBundleRequest - 4, // 27: proto.BundleService.GetBundle:input_type -> proto.GetBundleRequest - 6, // 28: proto.BundleService.ListBundles:input_type -> proto.ListBundlesRequest - 8, // 29: proto.ValueService.SaveValue:input_type -> proto.SaveValueRequest - 10, // 30: proto.ValueService.GetValue:input_type -> proto.GetValueRequest - 12, // 31: proto.ValueService.ListValues:input_type -> proto.ListValuesRequest - 14, // 32: proto.ValueService.GetValueByUniqueIdentifiers:input_type -> proto.GetValueByUniqueIdentifiersRequest - 3, // 33: proto.BundleService.SaveBundle:output_type -> proto.SaveBundleResponse - 5, // 34: proto.BundleService.GetBundle:output_type -> proto.GetBundleResponse - 7, // 35: proto.BundleService.ListBundles:output_type -> proto.ListBundlesResponse - 9, // 36: proto.ValueService.SaveValue:output_type -> proto.SaveValueResponse - 11, // 37: proto.ValueService.GetValue:output_type -> proto.GetValueResponse - 13, // 38: proto.ValueService.ListValues:output_type -> proto.ListValuesResponse - 11, // 39: proto.ValueService.GetValueByUniqueIdentifiers:output_type -> proto.GetValueResponse - 33, // [33:40] is the sub-list for method output_type - 26, // [26:33] is the sub-list for method input_type - 26, // [26:26] is the sub-list for extension type_name - 26, // [26:26] is the sub-list for extension extendee - 0, // [0:26] is the sub-list for field type_name + 29, // 0: proto.SaveBundleRequest.bundle:type_name -> proto.Bundle + 29, // 1: proto.SaveBundleResponse.bundle:type_name -> proto.Bundle + 29, // 2: proto.GetBundleResponse.bundle:type_name -> proto.Bundle + 29, // 3: proto.ListBundlesResponse.bundles:type_name -> proto.Bundle + 30, // 4: proto.AddSettingToBundleRequest.setting:type_name -> proto.Setting + 30, // 5: proto.AddSettingToBundleResponse.setting:type_name -> proto.Setting + 38, // 6: proto.SaveValueRequest.value:type_name -> proto.Value + 20, // 7: proto.SaveValueResponse.value:type_name -> proto.ValueWithIdentifier + 20, // 8: proto.GetValueResponse.value:type_name -> proto.ValueWithIdentifier + 20, // 9: proto.ListValuesResponse.values:type_name -> proto.ValueWithIdentifier + 21, // 10: proto.ValueWithIdentifier.identifier:type_name -> proto.Identifier + 38, // 11: proto.ValueWithIdentifier.value:type_name -> proto.Value + 27, // 12: proto.ListRoleAssignmentsResponse.assignments:type_name -> proto.UserRoleAssignment + 27, // 13: proto.AssignRoleToUserResponse.assignment:type_name -> proto.UserRoleAssignment + 0, // 14: proto.Resource.type:type_name -> proto.Resource.Type + 1, // 15: proto.Bundle.type:type_name -> proto.Bundle.Type + 30, // 16: proto.Bundle.settings:type_name -> proto.Setting + 28, // 17: proto.Bundle.resource:type_name -> proto.Resource + 31, // 18: proto.Setting.int_value:type_name -> proto.Int + 32, // 19: proto.Setting.string_value:type_name -> proto.String + 33, // 20: proto.Setting.bool_value:type_name -> proto.Bool + 34, // 21: proto.Setting.single_choice_value:type_name -> proto.SingleChoiceList + 35, // 22: proto.Setting.multi_choice_value:type_name -> proto.MultiChoiceList + 37, // 23: proto.Setting.permission_value:type_name -> proto.Permission + 28, // 24: proto.Setting.resource:type_name -> proto.Resource + 36, // 25: proto.SingleChoiceList.options:type_name -> proto.ListOption + 36, // 26: proto.MultiChoiceList.options:type_name -> proto.ListOption + 40, // 27: proto.ListOption.value:type_name -> proto.ListOptionValue + 2, // 28: proto.Permission.operation:type_name -> proto.Permission.Operation + 3, // 29: proto.Permission.constraint:type_name -> proto.Permission.Constraint + 28, // 30: proto.Value.resource:type_name -> proto.Resource + 39, // 31: proto.Value.list_value:type_name -> proto.ListValue + 40, // 32: proto.ListValue.values:type_name -> proto.ListOptionValue + 4, // 33: proto.BundleService.SaveBundle:input_type -> proto.SaveBundleRequest + 6, // 34: proto.BundleService.GetBundle:input_type -> proto.GetBundleRequest + 8, // 35: proto.BundleService.ListBundles:input_type -> proto.ListBundlesRequest + 10, // 36: proto.BundleService.AddSettingToBundle:input_type -> proto.AddSettingToBundleRequest + 12, // 37: proto.BundleService.RemoveSettingFromBundle:input_type -> proto.RemoveSettingFromBundleRequest + 13, // 38: proto.ValueService.SaveValue:input_type -> proto.SaveValueRequest + 15, // 39: proto.ValueService.GetValue:input_type -> proto.GetValueRequest + 17, // 40: proto.ValueService.ListValues:input_type -> proto.ListValuesRequest + 19, // 41: proto.ValueService.GetValueByUniqueIdentifiers:input_type -> proto.GetValueByUniqueIdentifiersRequest + 8, // 42: proto.RoleService.ListRoles:input_type -> proto.ListBundlesRequest + 22, // 43: proto.RoleService.ListRoleAssignments:input_type -> proto.ListRoleAssignmentsRequest + 24, // 44: proto.RoleService.AssignRoleToUser:input_type -> proto.AssignRoleToUserRequest + 26, // 45: proto.RoleService.RemoveRoleFromUser:input_type -> proto.RemoveRoleFromUserRequest + 5, // 46: proto.BundleService.SaveBundle:output_type -> proto.SaveBundleResponse + 7, // 47: proto.BundleService.GetBundle:output_type -> proto.GetBundleResponse + 9, // 48: proto.BundleService.ListBundles:output_type -> proto.ListBundlesResponse + 11, // 49: proto.BundleService.AddSettingToBundle:output_type -> proto.AddSettingToBundleResponse + 41, // 50: proto.BundleService.RemoveSettingFromBundle:output_type -> google.protobuf.Empty + 14, // 51: proto.ValueService.SaveValue:output_type -> proto.SaveValueResponse + 16, // 52: proto.ValueService.GetValue:output_type -> proto.GetValueResponse + 18, // 53: proto.ValueService.ListValues:output_type -> proto.ListValuesResponse + 16, // 54: proto.ValueService.GetValueByUniqueIdentifiers:output_type -> proto.GetValueResponse + 9, // 55: proto.RoleService.ListRoles:output_type -> proto.ListBundlesResponse + 23, // 56: proto.RoleService.ListRoleAssignments:output_type -> proto.ListRoleAssignmentsResponse + 25, // 57: proto.RoleService.AssignRoleToUser:output_type -> proto.AssignRoleToUserResponse + 41, // 58: proto.RoleService.RemoveRoleFromUser:output_type -> google.protobuf.Empty + 46, // [46:59] is the sub-list for method output_type + 33, // [33:46] is the sub-list for method input_type + 33, // [33:33] is the sub-list for extension type_name + 33, // [33:33] is the sub-list for extension extendee + 0, // [0:33] is the sub-list for field type_name } func init() { file_settings_proto_init() } @@ -2298,7 +3097,7 @@ func file_settings_proto_init() { } } file_settings_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SaveValueRequest); i { + switch v := v.(*AddSettingToBundleRequest); i { case 0: return &v.state case 1: @@ -2310,7 +3109,7 @@ func file_settings_proto_init() { } } file_settings_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SaveValueResponse); i { + switch v := v.(*AddSettingToBundleResponse); i { case 0: return &v.state case 1: @@ -2322,7 +3121,7 @@ func file_settings_proto_init() { } } file_settings_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetValueRequest); i { + switch v := v.(*RemoveSettingFromBundleRequest); i { case 0: return &v.state case 1: @@ -2334,7 +3133,7 @@ func file_settings_proto_init() { } } file_settings_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetValueResponse); i { + switch v := v.(*SaveValueRequest); i { case 0: return &v.state case 1: @@ -2346,7 +3145,7 @@ func file_settings_proto_init() { } } file_settings_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListValuesRequest); i { + switch v := v.(*SaveValueResponse); i { case 0: return &v.state case 1: @@ -2358,7 +3157,7 @@ func file_settings_proto_init() { } } file_settings_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListValuesResponse); i { + switch v := v.(*GetValueRequest); i { case 0: return &v.state case 1: @@ -2370,7 +3169,7 @@ func file_settings_proto_init() { } } file_settings_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetValueByUniqueIdentifiersRequest); i { + switch v := v.(*GetValueResponse); i { case 0: return &v.state case 1: @@ -2382,7 +3181,7 @@ func file_settings_proto_init() { } } file_settings_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValueWithIdentifier); i { + switch v := v.(*ListValuesRequest); i { case 0: return &v.state case 1: @@ -2394,7 +3193,7 @@ func file_settings_proto_init() { } } file_settings_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Identifier); i { + switch v := v.(*ListValuesResponse); i { case 0: return &v.state case 1: @@ -2406,7 +3205,7 @@ func file_settings_proto_init() { } } file_settings_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Resource); i { + switch v := v.(*GetValueByUniqueIdentifiersRequest); i { case 0: return &v.state case 1: @@ -2418,7 +3217,7 @@ func file_settings_proto_init() { } } file_settings_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Bundle); i { + switch v := v.(*ValueWithIdentifier); i { case 0: return &v.state case 1: @@ -2430,7 +3229,7 @@ func file_settings_proto_init() { } } file_settings_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Setting); i { + switch v := v.(*Identifier); i { case 0: return &v.state case 1: @@ -2442,7 +3241,7 @@ func file_settings_proto_init() { } } file_settings_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Int); i { + switch v := v.(*ListRoleAssignmentsRequest); i { case 0: return &v.state case 1: @@ -2454,7 +3253,7 @@ func file_settings_proto_init() { } } file_settings_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*String); i { + switch v := v.(*ListRoleAssignmentsResponse); i { case 0: return &v.state case 1: @@ -2466,7 +3265,7 @@ func file_settings_proto_init() { } } file_settings_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Bool); i { + switch v := v.(*AssignRoleToUserRequest); i { case 0: return &v.state case 1: @@ -2478,7 +3277,7 @@ func file_settings_proto_init() { } } file_settings_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SingleChoiceList); i { + switch v := v.(*AssignRoleToUserResponse); i { case 0: return &v.state case 1: @@ -2490,7 +3289,7 @@ func file_settings_proto_init() { } } file_settings_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MultiChoiceList); i { + switch v := v.(*RemoveRoleFromUserRequest); i { case 0: return &v.state case 1: @@ -2502,7 +3301,7 @@ func file_settings_proto_init() { } } file_settings_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListOption); i { + switch v := v.(*UserRoleAssignment); i { case 0: return &v.state case 1: @@ -2514,7 +3313,7 @@ func file_settings_proto_init() { } } file_settings_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Value); i { + switch v := v.(*Resource); i { case 0: return &v.state case 1: @@ -2526,7 +3325,7 @@ func file_settings_proto_init() { } } file_settings_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListValue); i { + switch v := v.(*Bundle); i { case 0: return &v.state case 1: @@ -2538,6 +3337,126 @@ func file_settings_proto_init() { } } file_settings_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Setting); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_settings_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Int); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_settings_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*String); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_settings_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Bool); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_settings_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SingleChoiceList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_settings_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MultiChoiceList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_settings_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListOption); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_settings_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Permission); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_settings_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Value); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_settings_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListValue); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_settings_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListOptionValue); i { case 0: return &v.state @@ -2550,20 +3469,21 @@ func file_settings_proto_init() { } } } - file_settings_proto_msgTypes[17].OneofWrappers = []interface{}{ + file_settings_proto_msgTypes[26].OneofWrappers = []interface{}{ (*Setting_IntValue)(nil), (*Setting_StringValue)(nil), (*Setting_BoolValue)(nil), (*Setting_SingleChoiceValue)(nil), (*Setting_MultiChoiceValue)(nil), + (*Setting_PermissionValue)(nil), } - file_settings_proto_msgTypes[24].OneofWrappers = []interface{}{ + file_settings_proto_msgTypes[34].OneofWrappers = []interface{}{ (*Value_BoolValue)(nil), (*Value_IntValue)(nil), (*Value_StringValue)(nil), (*Value_ListValue)(nil), } - file_settings_proto_msgTypes[26].OneofWrappers = []interface{}{ + file_settings_proto_msgTypes[36].OneofWrappers = []interface{}{ (*ListOptionValue_StringValue)(nil), (*ListOptionValue_IntValue)(nil), } @@ -2572,10 +3492,10 @@ func file_settings_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_settings_proto_rawDesc, - NumEnums: 2, - NumMessages: 27, + NumEnums: 4, + NumMessages: 37, NumExtensions: 0, - NumServices: 2, + NumServices: 3, }, GoTypes: file_settings_proto_goTypes, DependencyIndexes: file_settings_proto_depIdxs, diff --git a/pkg/proto/v0/settings.pb.micro.go b/pkg/proto/v0/settings.pb.micro.go index 7eb14047e..87cd9663b 100644 --- a/pkg/proto/v0/settings.pb.micro.go +++ b/pkg/proto/v0/settings.pb.micro.go @@ -6,6 +6,7 @@ package proto import ( fmt "fmt" proto "github.com/golang/protobuf/proto" + empty "github.com/golang/protobuf/ptypes/empty" _ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options" _ "google.golang.org/genproto/googleapis/api/annotations" math "math" @@ -60,6 +61,20 @@ func NewBundleServiceEndpoints() []*api.Endpoint { Body: "*", Handler: "rpc", }, + &api.Endpoint{ + Name: "BundleService.AddSettingToBundle", + Path: []string{"/api/v0/settings/bundles-add-setting"}, + Method: []string{"POST"}, + Body: "*", + Handler: "rpc", + }, + &api.Endpoint{ + Name: "BundleService.RemoveSettingFromBundle", + Path: []string{"/api/v0/settings/bundles-remove-setting"}, + Method: []string{"POST"}, + Body: "*", + Handler: "rpc", + }, } } @@ -69,6 +84,8 @@ type BundleService interface { SaveBundle(ctx context.Context, in *SaveBundleRequest, opts ...client.CallOption) (*SaveBundleResponse, error) GetBundle(ctx context.Context, in *GetBundleRequest, opts ...client.CallOption) (*GetBundleResponse, error) ListBundles(ctx context.Context, in *ListBundlesRequest, opts ...client.CallOption) (*ListBundlesResponse, error) + AddSettingToBundle(ctx context.Context, in *AddSettingToBundleRequest, opts ...client.CallOption) (*AddSettingToBundleResponse, error) + RemoveSettingFromBundle(ctx context.Context, in *RemoveSettingFromBundleRequest, opts ...client.CallOption) (*empty.Empty, error) } type bundleService struct { @@ -113,12 +130,34 @@ func (c *bundleService) ListBundles(ctx context.Context, in *ListBundlesRequest, return out, nil } +func (c *bundleService) AddSettingToBundle(ctx context.Context, in *AddSettingToBundleRequest, opts ...client.CallOption) (*AddSettingToBundleResponse, error) { + req := c.c.NewRequest(c.name, "BundleService.AddSettingToBundle", in) + out := new(AddSettingToBundleResponse) + err := c.c.Call(ctx, req, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *bundleService) RemoveSettingFromBundle(ctx context.Context, in *RemoveSettingFromBundleRequest, opts ...client.CallOption) (*empty.Empty, error) { + req := c.c.NewRequest(c.name, "BundleService.RemoveSettingFromBundle", in) + out := new(empty.Empty) + err := c.c.Call(ctx, req, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // Server API for BundleService service type BundleServiceHandler interface { SaveBundle(context.Context, *SaveBundleRequest, *SaveBundleResponse) error GetBundle(context.Context, *GetBundleRequest, *GetBundleResponse) error ListBundles(context.Context, *ListBundlesRequest, *ListBundlesResponse) error + AddSettingToBundle(context.Context, *AddSettingToBundleRequest, *AddSettingToBundleResponse) error + RemoveSettingFromBundle(context.Context, *RemoveSettingFromBundleRequest, *empty.Empty) error } func RegisterBundleServiceHandler(s server.Server, hdlr BundleServiceHandler, opts ...server.HandlerOption) error { @@ -126,6 +165,8 @@ func RegisterBundleServiceHandler(s server.Server, hdlr BundleServiceHandler, op SaveBundle(ctx context.Context, in *SaveBundleRequest, out *SaveBundleResponse) error GetBundle(ctx context.Context, in *GetBundleRequest, out *GetBundleResponse) error ListBundles(ctx context.Context, in *ListBundlesRequest, out *ListBundlesResponse) error + AddSettingToBundle(ctx context.Context, in *AddSettingToBundleRequest, out *AddSettingToBundleResponse) error + RemoveSettingFromBundle(ctx context.Context, in *RemoveSettingFromBundleRequest, out *empty.Empty) error } type BundleService struct { bundleService @@ -152,6 +193,20 @@ func RegisterBundleServiceHandler(s server.Server, hdlr BundleServiceHandler, op Body: "*", Handler: "rpc", })) + opts = append(opts, api.WithEndpoint(&api.Endpoint{ + Name: "BundleService.AddSettingToBundle", + Path: []string{"/api/v0/settings/bundles-add-setting"}, + Method: []string{"POST"}, + Body: "*", + Handler: "rpc", + })) + opts = append(opts, api.WithEndpoint(&api.Endpoint{ + Name: "BundleService.RemoveSettingFromBundle", + Path: []string{"/api/v0/settings/bundles-remove-setting"}, + Method: []string{"POST"}, + Body: "*", + Handler: "rpc", + })) return s.Handle(s.NewHandler(&BundleService{h}, opts...)) } @@ -171,6 +226,14 @@ func (h *bundleServiceHandler) ListBundles(ctx context.Context, in *ListBundlesR return h.BundleServiceHandler.ListBundles(ctx, in, out) } +func (h *bundleServiceHandler) AddSettingToBundle(ctx context.Context, in *AddSettingToBundleRequest, out *AddSettingToBundleResponse) error { + return h.BundleServiceHandler.AddSettingToBundle(ctx, in, out) +} + +func (h *bundleServiceHandler) RemoveSettingFromBundle(ctx context.Context, in *RemoveSettingFromBundleRequest, out *empty.Empty) error { + return h.BundleServiceHandler.RemoveSettingFromBundle(ctx, in, out) +} + // Api Endpoints for ValueService service func NewValueServiceEndpoints() []*api.Endpoint { @@ -337,3 +400,170 @@ func (h *valueServiceHandler) ListValues(ctx context.Context, in *ListValuesRequ func (h *valueServiceHandler) GetValueByUniqueIdentifiers(ctx context.Context, in *GetValueByUniqueIdentifiersRequest, out *GetValueResponse) error { return h.ValueServiceHandler.GetValueByUniqueIdentifiers(ctx, in, out) } + +// Api Endpoints for RoleService service + +func NewRoleServiceEndpoints() []*api.Endpoint { + return []*api.Endpoint{ + &api.Endpoint{ + Name: "RoleService.ListRoles", + Path: []string{"/api/v0/settings/roles-list"}, + Method: []string{"POST"}, + Body: "*", + Handler: "rpc", + }, + &api.Endpoint{ + Name: "RoleService.ListRoleAssignments", + Path: []string{"/api/v0/settings/assignments-list"}, + Method: []string{"POST"}, + Body: "*", + Handler: "rpc", + }, + &api.Endpoint{ + Name: "RoleService.AssignRoleToUser", + Path: []string{"/api/v0/settings/assignments-add"}, + Method: []string{"POST"}, + Body: "*", + Handler: "rpc", + }, + &api.Endpoint{ + Name: "RoleService.RemoveRoleFromUser", + Path: []string{"/api/v0/settings/assignments-remove"}, + Method: []string{"POST"}, + Body: "*", + Handler: "rpc", + }, + } +} + +// Client API for RoleService service + +type RoleService interface { + ListRoles(ctx context.Context, in *ListBundlesRequest, opts ...client.CallOption) (*ListBundlesResponse, error) + ListRoleAssignments(ctx context.Context, in *ListRoleAssignmentsRequest, opts ...client.CallOption) (*ListRoleAssignmentsResponse, error) + AssignRoleToUser(ctx context.Context, in *AssignRoleToUserRequest, opts ...client.CallOption) (*AssignRoleToUserResponse, error) + RemoveRoleFromUser(ctx context.Context, in *RemoveRoleFromUserRequest, opts ...client.CallOption) (*empty.Empty, error) +} + +type roleService struct { + c client.Client + name string +} + +func NewRoleService(name string, c client.Client) RoleService { + return &roleService{ + c: c, + name: name, + } +} + +func (c *roleService) ListRoles(ctx context.Context, in *ListBundlesRequest, opts ...client.CallOption) (*ListBundlesResponse, error) { + req := c.c.NewRequest(c.name, "RoleService.ListRoles", in) + out := new(ListBundlesResponse) + err := c.c.Call(ctx, req, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *roleService) ListRoleAssignments(ctx context.Context, in *ListRoleAssignmentsRequest, opts ...client.CallOption) (*ListRoleAssignmentsResponse, error) { + req := c.c.NewRequest(c.name, "RoleService.ListRoleAssignments", in) + out := new(ListRoleAssignmentsResponse) + err := c.c.Call(ctx, req, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *roleService) AssignRoleToUser(ctx context.Context, in *AssignRoleToUserRequest, opts ...client.CallOption) (*AssignRoleToUserResponse, error) { + req := c.c.NewRequest(c.name, "RoleService.AssignRoleToUser", in) + out := new(AssignRoleToUserResponse) + err := c.c.Call(ctx, req, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *roleService) RemoveRoleFromUser(ctx context.Context, in *RemoveRoleFromUserRequest, opts ...client.CallOption) (*empty.Empty, error) { + req := c.c.NewRequest(c.name, "RoleService.RemoveRoleFromUser", in) + out := new(empty.Empty) + err := c.c.Call(ctx, req, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// Server API for RoleService service + +type RoleServiceHandler interface { + ListRoles(context.Context, *ListBundlesRequest, *ListBundlesResponse) error + ListRoleAssignments(context.Context, *ListRoleAssignmentsRequest, *ListRoleAssignmentsResponse) error + AssignRoleToUser(context.Context, *AssignRoleToUserRequest, *AssignRoleToUserResponse) error + RemoveRoleFromUser(context.Context, *RemoveRoleFromUserRequest, *empty.Empty) error +} + +func RegisterRoleServiceHandler(s server.Server, hdlr RoleServiceHandler, opts ...server.HandlerOption) error { + type roleService interface { + ListRoles(ctx context.Context, in *ListBundlesRequest, out *ListBundlesResponse) error + ListRoleAssignments(ctx context.Context, in *ListRoleAssignmentsRequest, out *ListRoleAssignmentsResponse) error + AssignRoleToUser(ctx context.Context, in *AssignRoleToUserRequest, out *AssignRoleToUserResponse) error + RemoveRoleFromUser(ctx context.Context, in *RemoveRoleFromUserRequest, out *empty.Empty) error + } + type RoleService struct { + roleService + } + h := &roleServiceHandler{hdlr} + opts = append(opts, api.WithEndpoint(&api.Endpoint{ + Name: "RoleService.ListRoles", + Path: []string{"/api/v0/settings/roles-list"}, + Method: []string{"POST"}, + Body: "*", + Handler: "rpc", + })) + opts = append(opts, api.WithEndpoint(&api.Endpoint{ + Name: "RoleService.ListRoleAssignments", + Path: []string{"/api/v0/settings/assignments-list"}, + Method: []string{"POST"}, + Body: "*", + Handler: "rpc", + })) + opts = append(opts, api.WithEndpoint(&api.Endpoint{ + Name: "RoleService.AssignRoleToUser", + Path: []string{"/api/v0/settings/assignments-add"}, + Method: []string{"POST"}, + Body: "*", + Handler: "rpc", + })) + opts = append(opts, api.WithEndpoint(&api.Endpoint{ + Name: "RoleService.RemoveRoleFromUser", + Path: []string{"/api/v0/settings/assignments-remove"}, + Method: []string{"POST"}, + Body: "*", + Handler: "rpc", + })) + return s.Handle(s.NewHandler(&RoleService{h}, opts...)) +} + +type roleServiceHandler struct { + RoleServiceHandler +} + +func (h *roleServiceHandler) ListRoles(ctx context.Context, in *ListBundlesRequest, out *ListBundlesResponse) error { + return h.RoleServiceHandler.ListRoles(ctx, in, out) +} + +func (h *roleServiceHandler) ListRoleAssignments(ctx context.Context, in *ListRoleAssignmentsRequest, out *ListRoleAssignmentsResponse) error { + return h.RoleServiceHandler.ListRoleAssignments(ctx, in, out) +} + +func (h *roleServiceHandler) AssignRoleToUser(ctx context.Context, in *AssignRoleToUserRequest, out *AssignRoleToUserResponse) error { + return h.RoleServiceHandler.AssignRoleToUser(ctx, in, out) +} + +func (h *roleServiceHandler) RemoveRoleFromUser(ctx context.Context, in *RemoveRoleFromUserRequest, out *empty.Empty) error { + return h.RoleServiceHandler.RemoveRoleFromUser(ctx, in, out) +} diff --git a/pkg/proto/v0/settings.pb.micro_test.go b/pkg/proto/v0/settings.pb.micro_test.go index 9cd1a56e9..c94ef5959 100644 --- a/pkg/proto/v0/settings.pb.micro_test.go +++ b/pkg/proto/v0/settings.pb.micro_test.go @@ -3,10 +3,12 @@ package proto_test import ( "context" "encoding/json" + fmt "fmt" "log" "os" "testing" + mgrpc "github.com/micro/go-micro/v2/client/grpc" ocislog "github.com/owncloud/ocis-pkg/v2/log" "github.com/owncloud/ocis-pkg/v2/service/grpc" "github.com/owncloud/ocis-settings/pkg/config" @@ -59,6 +61,10 @@ func init() { if err != nil { log.Fatalf("could not register ValueServiceHandler: %v", err) } + err = proto.RegisterRoleServiceHandler(service.Server(), svc.NewService(cfg, ocislog.NewLogger(ocislog.Color(true), ocislog.Pretty(true)))) + if err != nil { + log.Fatalf("could not register RegisterRoleServiceHandler: %v", err) + } if err = service.Server().Start(); err != nil { log.Fatalf("could not start server: %v", err) @@ -627,6 +633,52 @@ func TestGetSettingsBundleCreatesFolder(t *testing.T) { os.RemoveAll(dataStore) } +// TODO non-deterministic. Fix. +func TestCreateRoleAndAssign(t *testing.T) { + c := mgrpc.NewClient() + bundleC := proto.NewBundleService("com.owncloud.api.settings", c) + + res, err := bundleC.SaveBundle(context.Background(), &proto.SaveBundleRequest{ + Bundle: &proto.Bundle{ + // Id: "f36db5e6-a03c-40df-8413-711c67e40b47", // bug: providing the ID ignores its value for the filename. + Type: proto.Bundle_TYPE_ROLE, + DisplayName: "test role - update", + Name: "TEST_ROLE", + Extension: "ocis-settings", + Settings: []*proto.Setting{ + { + Name: "settingName", + Resource: &proto.Resource{ + Id: settingsStub[0].Id, + Type: proto.Resource_TYPE_SETTING, + }, + Value: &proto.Setting_PermissionValue{ + &proto.Permission{ + Operation: proto.Permission_OPERATION_UPDATE, + Constraint: proto.Permission_CONSTRAINT_OWN, + }, + }, + }, + }, + Resource: &proto.Resource{ + Type: proto.Resource_TYPE_SYSTEM, + }, + }, + }) + if err == nil { + rolesC := proto.NewRoleService("com.owncloud.api.settings", c) + _, err = rolesC.AssignRoleToUser(context.Background(), &proto.AssignRoleToUserRequest{ + AccountUuid: "4c510ada-c86b-4815-8820-42cdf82c3d51", + RoleId: res.Bundle.Id, + }) + if err != nil { + fmt.Println(err) + } + assert.NoError(t, err) + } + os.RemoveAll(dataStore) +} + // // TODO this tests are non-deterministic at least on my machine. Find a way to make them deterministic. // func TestListBudlesOnAuthorizedUser(t *testing.T) { // client := service.Client() diff --git a/pkg/proto/v0/settings.pb.web.go b/pkg/proto/v0/settings.pb.web.go index 04031742b..5c3917749 100644 --- a/pkg/proto/v0/settings.pb.web.go +++ b/pkg/proto/v0/settings.pb.web.go @@ -11,6 +11,8 @@ import ( "github.com/go-chi/chi" "github.com/go-chi/render" "github.com/golang/protobuf/jsonpb" + + "github.com/golang/protobuf/ptypes/empty" ) type webBundleServiceHandler struct { @@ -94,6 +96,53 @@ func (h *webBundleServiceHandler) ListBundles(w http.ResponseWriter, r *http.Req render.JSON(w, r, resp) } +func (h *webBundleServiceHandler) AddSettingToBundle(w http.ResponseWriter, r *http.Request) { + + req := &AddSettingToBundleRequest{} + + resp := &AddSettingToBundleResponse{} + + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + http.Error(w, err.Error(), http.StatusPreconditionFailed) + return + } + + if err := h.h.AddSettingToBundle( + r.Context(), + req, + resp, + ); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + render.Status(r, http.StatusCreated) + render.JSON(w, r, resp) +} + +func (h *webBundleServiceHandler) RemoveSettingFromBundle(w http.ResponseWriter, r *http.Request) { + + req := &RemoveSettingFromBundleRequest{} + resp := &empty.Empty{} + + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + http.Error(w, err.Error(), http.StatusPreconditionFailed) + return + } + + if err := h.h.RemoveSettingFromBundle( + r.Context(), + req, + resp, + ); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + render.Status(r, http.StatusNoContent) + render.NoContent(w, r) +} + func RegisterBundleServiceWeb(r chi.Router, i BundleServiceHandler, middlewares ...func(http.Handler) http.Handler) { handler := &webBundleServiceHandler{ r: r, @@ -103,6 +152,8 @@ func RegisterBundleServiceWeb(r chi.Router, i BundleServiceHandler, middlewares r.MethodFunc("POST", "/api/v0/settings/bundle-save", handler.SaveBundle) r.MethodFunc("POST", "/api/v0/settings/bundle-get", handler.GetBundle) r.MethodFunc("POST", "/api/v0/settings/bundles-list", handler.ListBundles) + r.MethodFunc("POST", "/api/v0/settings/bundles-add-setting", handler.AddSettingToBundle) + r.MethodFunc("POST", "/api/v0/settings/bundles-remove-setting", handler.RemoveSettingFromBundle) } type webValueServiceHandler struct { @@ -222,6 +273,122 @@ func RegisterValueServiceWeb(r chi.Router, i ValueServiceHandler, middlewares .. r.MethodFunc("POST", "/api/v0/settings/values-get-by-unique-identifiers", handler.GetValueByUniqueIdentifiers) } +type webRoleServiceHandler struct { + r chi.Router + h RoleServiceHandler +} + +func (h *webRoleServiceHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + h.r.ServeHTTP(w, r) +} + +func (h *webRoleServiceHandler) ListRoles(w http.ResponseWriter, r *http.Request) { + + req := &ListBundlesRequest{} + + resp := &ListBundlesResponse{} + + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + http.Error(w, err.Error(), http.StatusPreconditionFailed) + return + } + + if err := h.h.ListRoles( + r.Context(), + req, + resp, + ); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + render.Status(r, http.StatusCreated) + render.JSON(w, r, resp) +} + +func (h *webRoleServiceHandler) ListRoleAssignments(w http.ResponseWriter, r *http.Request) { + + req := &ListRoleAssignmentsRequest{} + + resp := &ListRoleAssignmentsResponse{} + + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + http.Error(w, err.Error(), http.StatusPreconditionFailed) + return + } + + if err := h.h.ListRoleAssignments( + r.Context(), + req, + resp, + ); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + render.Status(r, http.StatusCreated) + render.JSON(w, r, resp) +} + +func (h *webRoleServiceHandler) AssignRoleToUser(w http.ResponseWriter, r *http.Request) { + + req := &AssignRoleToUserRequest{} + + resp := &AssignRoleToUserResponse{} + + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + http.Error(w, err.Error(), http.StatusPreconditionFailed) + return + } + + if err := h.h.AssignRoleToUser( + r.Context(), + req, + resp, + ); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + render.Status(r, http.StatusCreated) + render.JSON(w, r, resp) +} + +func (h *webRoleServiceHandler) RemoveRoleFromUser(w http.ResponseWriter, r *http.Request) { + + req := &RemoveRoleFromUserRequest{} + resp := &empty.Empty{} + + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + http.Error(w, err.Error(), http.StatusPreconditionFailed) + return + } + + if err := h.h.RemoveRoleFromUser( + r.Context(), + req, + resp, + ); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + render.Status(r, http.StatusNoContent) + render.NoContent(w, r) +} + +func RegisterRoleServiceWeb(r chi.Router, i RoleServiceHandler, middlewares ...func(http.Handler) http.Handler) { + handler := &webRoleServiceHandler{ + r: r, + h: i, + } + + r.MethodFunc("POST", "/api/v0/settings/roles-list", handler.ListRoles) + r.MethodFunc("POST", "/api/v0/settings/assignments-list", handler.ListRoleAssignments) + r.MethodFunc("POST", "/api/v0/settings/assignments-add", handler.AssignRoleToUser) + r.MethodFunc("POST", "/api/v0/settings/assignments-remove", handler.RemoveRoleFromUser) +} + // SaveBundleRequestJSONMarshaler describes the default jsonpb.Marshaler used by all // instances of SaveBundleRequest. This struct is safe to replace or modify but // should not be done so concurrently. @@ -438,6 +605,114 @@ func (m *ListBundlesResponse) UnmarshalJSON(b []byte) error { var _ json.Unmarshaler = (*ListBundlesResponse)(nil) +// AddSettingToBundleRequestJSONMarshaler describes the default jsonpb.Marshaler used by all +// instances of AddSettingToBundleRequest. This struct is safe to replace or modify but +// should not be done so concurrently. +var AddSettingToBundleRequestJSONMarshaler = new(jsonpb.Marshaler) + +// MarshalJSON satisfies the encoding/json Marshaler interface. This method +// uses the more correct jsonpb package to correctly marshal the message. +func (m *AddSettingToBundleRequest) MarshalJSON() ([]byte, error) { + if m == nil { + return json.Marshal(nil) + } + + buf := &bytes.Buffer{} + + if err := AddSettingToBundleRequestJSONMarshaler.Marshal(buf, m); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +var _ json.Marshaler = (*AddSettingToBundleRequest)(nil) + +// AddSettingToBundleRequestJSONUnmarshaler describes the default jsonpb.Unmarshaler used by all +// instances of AddSettingToBundleRequest. This struct is safe to replace or modify but +// should not be done so concurrently. +var AddSettingToBundleRequestJSONUnmarshaler = new(jsonpb.Unmarshaler) + +// UnmarshalJSON satisfies the encoding/json Unmarshaler interface. This method +// uses the more correct jsonpb package to correctly unmarshal the message. +func (m *AddSettingToBundleRequest) UnmarshalJSON(b []byte) error { + return AddSettingToBundleRequestJSONUnmarshaler.Unmarshal(bytes.NewReader(b), m) +} + +var _ json.Unmarshaler = (*AddSettingToBundleRequest)(nil) + +// AddSettingToBundleResponseJSONMarshaler describes the default jsonpb.Marshaler used by all +// instances of AddSettingToBundleResponse. This struct is safe to replace or modify but +// should not be done so concurrently. +var AddSettingToBundleResponseJSONMarshaler = new(jsonpb.Marshaler) + +// MarshalJSON satisfies the encoding/json Marshaler interface. This method +// uses the more correct jsonpb package to correctly marshal the message. +func (m *AddSettingToBundleResponse) MarshalJSON() ([]byte, error) { + if m == nil { + return json.Marshal(nil) + } + + buf := &bytes.Buffer{} + + if err := AddSettingToBundleResponseJSONMarshaler.Marshal(buf, m); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +var _ json.Marshaler = (*AddSettingToBundleResponse)(nil) + +// AddSettingToBundleResponseJSONUnmarshaler describes the default jsonpb.Unmarshaler used by all +// instances of AddSettingToBundleResponse. This struct is safe to replace or modify but +// should not be done so concurrently. +var AddSettingToBundleResponseJSONUnmarshaler = new(jsonpb.Unmarshaler) + +// UnmarshalJSON satisfies the encoding/json Unmarshaler interface. This method +// uses the more correct jsonpb package to correctly unmarshal the message. +func (m *AddSettingToBundleResponse) UnmarshalJSON(b []byte) error { + return AddSettingToBundleResponseJSONUnmarshaler.Unmarshal(bytes.NewReader(b), m) +} + +var _ json.Unmarshaler = (*AddSettingToBundleResponse)(nil) + +// RemoveSettingFromBundleRequestJSONMarshaler describes the default jsonpb.Marshaler used by all +// instances of RemoveSettingFromBundleRequest. This struct is safe to replace or modify but +// should not be done so concurrently. +var RemoveSettingFromBundleRequestJSONMarshaler = new(jsonpb.Marshaler) + +// MarshalJSON satisfies the encoding/json Marshaler interface. This method +// uses the more correct jsonpb package to correctly marshal the message. +func (m *RemoveSettingFromBundleRequest) MarshalJSON() ([]byte, error) { + if m == nil { + return json.Marshal(nil) + } + + buf := &bytes.Buffer{} + + if err := RemoveSettingFromBundleRequestJSONMarshaler.Marshal(buf, m); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +var _ json.Marshaler = (*RemoveSettingFromBundleRequest)(nil) + +// RemoveSettingFromBundleRequestJSONUnmarshaler describes the default jsonpb.Unmarshaler used by all +// instances of RemoveSettingFromBundleRequest. This struct is safe to replace or modify but +// should not be done so concurrently. +var RemoveSettingFromBundleRequestJSONUnmarshaler = new(jsonpb.Unmarshaler) + +// UnmarshalJSON satisfies the encoding/json Unmarshaler interface. This method +// uses the more correct jsonpb package to correctly unmarshal the message. +func (m *RemoveSettingFromBundleRequest) UnmarshalJSON(b []byte) error { + return RemoveSettingFromBundleRequestJSONUnmarshaler.Unmarshal(bytes.NewReader(b), m) +} + +var _ json.Unmarshaler = (*RemoveSettingFromBundleRequest)(nil) + // SaveValueRequestJSONMarshaler describes the default jsonpb.Marshaler used by all // instances of SaveValueRequest. This struct is safe to replace or modify but // should not be done so concurrently. @@ -762,6 +1037,222 @@ func (m *Identifier) UnmarshalJSON(b []byte) error { var _ json.Unmarshaler = (*Identifier)(nil) +// ListRoleAssignmentsRequestJSONMarshaler describes the default jsonpb.Marshaler used by all +// instances of ListRoleAssignmentsRequest. This struct is safe to replace or modify but +// should not be done so concurrently. +var ListRoleAssignmentsRequestJSONMarshaler = new(jsonpb.Marshaler) + +// MarshalJSON satisfies the encoding/json Marshaler interface. This method +// uses the more correct jsonpb package to correctly marshal the message. +func (m *ListRoleAssignmentsRequest) MarshalJSON() ([]byte, error) { + if m == nil { + return json.Marshal(nil) + } + + buf := &bytes.Buffer{} + + if err := ListRoleAssignmentsRequestJSONMarshaler.Marshal(buf, m); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +var _ json.Marshaler = (*ListRoleAssignmentsRequest)(nil) + +// ListRoleAssignmentsRequestJSONUnmarshaler describes the default jsonpb.Unmarshaler used by all +// instances of ListRoleAssignmentsRequest. This struct is safe to replace or modify but +// should not be done so concurrently. +var ListRoleAssignmentsRequestJSONUnmarshaler = new(jsonpb.Unmarshaler) + +// UnmarshalJSON satisfies the encoding/json Unmarshaler interface. This method +// uses the more correct jsonpb package to correctly unmarshal the message. +func (m *ListRoleAssignmentsRequest) UnmarshalJSON(b []byte) error { + return ListRoleAssignmentsRequestJSONUnmarshaler.Unmarshal(bytes.NewReader(b), m) +} + +var _ json.Unmarshaler = (*ListRoleAssignmentsRequest)(nil) + +// ListRoleAssignmentsResponseJSONMarshaler describes the default jsonpb.Marshaler used by all +// instances of ListRoleAssignmentsResponse. This struct is safe to replace or modify but +// should not be done so concurrently. +var ListRoleAssignmentsResponseJSONMarshaler = new(jsonpb.Marshaler) + +// MarshalJSON satisfies the encoding/json Marshaler interface. This method +// uses the more correct jsonpb package to correctly marshal the message. +func (m *ListRoleAssignmentsResponse) MarshalJSON() ([]byte, error) { + if m == nil { + return json.Marshal(nil) + } + + buf := &bytes.Buffer{} + + if err := ListRoleAssignmentsResponseJSONMarshaler.Marshal(buf, m); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +var _ json.Marshaler = (*ListRoleAssignmentsResponse)(nil) + +// ListRoleAssignmentsResponseJSONUnmarshaler describes the default jsonpb.Unmarshaler used by all +// instances of ListRoleAssignmentsResponse. This struct is safe to replace or modify but +// should not be done so concurrently. +var ListRoleAssignmentsResponseJSONUnmarshaler = new(jsonpb.Unmarshaler) + +// UnmarshalJSON satisfies the encoding/json Unmarshaler interface. This method +// uses the more correct jsonpb package to correctly unmarshal the message. +func (m *ListRoleAssignmentsResponse) UnmarshalJSON(b []byte) error { + return ListRoleAssignmentsResponseJSONUnmarshaler.Unmarshal(bytes.NewReader(b), m) +} + +var _ json.Unmarshaler = (*ListRoleAssignmentsResponse)(nil) + +// AssignRoleToUserRequestJSONMarshaler describes the default jsonpb.Marshaler used by all +// instances of AssignRoleToUserRequest. This struct is safe to replace or modify but +// should not be done so concurrently. +var AssignRoleToUserRequestJSONMarshaler = new(jsonpb.Marshaler) + +// MarshalJSON satisfies the encoding/json Marshaler interface. This method +// uses the more correct jsonpb package to correctly marshal the message. +func (m *AssignRoleToUserRequest) MarshalJSON() ([]byte, error) { + if m == nil { + return json.Marshal(nil) + } + + buf := &bytes.Buffer{} + + if err := AssignRoleToUserRequestJSONMarshaler.Marshal(buf, m); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +var _ json.Marshaler = (*AssignRoleToUserRequest)(nil) + +// AssignRoleToUserRequestJSONUnmarshaler describes the default jsonpb.Unmarshaler used by all +// instances of AssignRoleToUserRequest. This struct is safe to replace or modify but +// should not be done so concurrently. +var AssignRoleToUserRequestJSONUnmarshaler = new(jsonpb.Unmarshaler) + +// UnmarshalJSON satisfies the encoding/json Unmarshaler interface. This method +// uses the more correct jsonpb package to correctly unmarshal the message. +func (m *AssignRoleToUserRequest) UnmarshalJSON(b []byte) error { + return AssignRoleToUserRequestJSONUnmarshaler.Unmarshal(bytes.NewReader(b), m) +} + +var _ json.Unmarshaler = (*AssignRoleToUserRequest)(nil) + +// AssignRoleToUserResponseJSONMarshaler describes the default jsonpb.Marshaler used by all +// instances of AssignRoleToUserResponse. This struct is safe to replace or modify but +// should not be done so concurrently. +var AssignRoleToUserResponseJSONMarshaler = new(jsonpb.Marshaler) + +// MarshalJSON satisfies the encoding/json Marshaler interface. This method +// uses the more correct jsonpb package to correctly marshal the message. +func (m *AssignRoleToUserResponse) MarshalJSON() ([]byte, error) { + if m == nil { + return json.Marshal(nil) + } + + buf := &bytes.Buffer{} + + if err := AssignRoleToUserResponseJSONMarshaler.Marshal(buf, m); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +var _ json.Marshaler = (*AssignRoleToUserResponse)(nil) + +// AssignRoleToUserResponseJSONUnmarshaler describes the default jsonpb.Unmarshaler used by all +// instances of AssignRoleToUserResponse. This struct is safe to replace or modify but +// should not be done so concurrently. +var AssignRoleToUserResponseJSONUnmarshaler = new(jsonpb.Unmarshaler) + +// UnmarshalJSON satisfies the encoding/json Unmarshaler interface. This method +// uses the more correct jsonpb package to correctly unmarshal the message. +func (m *AssignRoleToUserResponse) UnmarshalJSON(b []byte) error { + return AssignRoleToUserResponseJSONUnmarshaler.Unmarshal(bytes.NewReader(b), m) +} + +var _ json.Unmarshaler = (*AssignRoleToUserResponse)(nil) + +// RemoveRoleFromUserRequestJSONMarshaler describes the default jsonpb.Marshaler used by all +// instances of RemoveRoleFromUserRequest. This struct is safe to replace or modify but +// should not be done so concurrently. +var RemoveRoleFromUserRequestJSONMarshaler = new(jsonpb.Marshaler) + +// MarshalJSON satisfies the encoding/json Marshaler interface. This method +// uses the more correct jsonpb package to correctly marshal the message. +func (m *RemoveRoleFromUserRequest) MarshalJSON() ([]byte, error) { + if m == nil { + return json.Marshal(nil) + } + + buf := &bytes.Buffer{} + + if err := RemoveRoleFromUserRequestJSONMarshaler.Marshal(buf, m); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +var _ json.Marshaler = (*RemoveRoleFromUserRequest)(nil) + +// RemoveRoleFromUserRequestJSONUnmarshaler describes the default jsonpb.Unmarshaler used by all +// instances of RemoveRoleFromUserRequest. This struct is safe to replace or modify but +// should not be done so concurrently. +var RemoveRoleFromUserRequestJSONUnmarshaler = new(jsonpb.Unmarshaler) + +// UnmarshalJSON satisfies the encoding/json Unmarshaler interface. This method +// uses the more correct jsonpb package to correctly unmarshal the message. +func (m *RemoveRoleFromUserRequest) UnmarshalJSON(b []byte) error { + return RemoveRoleFromUserRequestJSONUnmarshaler.Unmarshal(bytes.NewReader(b), m) +} + +var _ json.Unmarshaler = (*RemoveRoleFromUserRequest)(nil) + +// UserRoleAssignmentJSONMarshaler describes the default jsonpb.Marshaler used by all +// instances of UserRoleAssignment. This struct is safe to replace or modify but +// should not be done so concurrently. +var UserRoleAssignmentJSONMarshaler = new(jsonpb.Marshaler) + +// MarshalJSON satisfies the encoding/json Marshaler interface. This method +// uses the more correct jsonpb package to correctly marshal the message. +func (m *UserRoleAssignment) MarshalJSON() ([]byte, error) { + if m == nil { + return json.Marshal(nil) + } + + buf := &bytes.Buffer{} + + if err := UserRoleAssignmentJSONMarshaler.Marshal(buf, m); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +var _ json.Marshaler = (*UserRoleAssignment)(nil) + +// UserRoleAssignmentJSONUnmarshaler describes the default jsonpb.Unmarshaler used by all +// instances of UserRoleAssignment. This struct is safe to replace or modify but +// should not be done so concurrently. +var UserRoleAssignmentJSONUnmarshaler = new(jsonpb.Unmarshaler) + +// UnmarshalJSON satisfies the encoding/json Unmarshaler interface. This method +// uses the more correct jsonpb package to correctly unmarshal the message. +func (m *UserRoleAssignment) UnmarshalJSON(b []byte) error { + return UserRoleAssignmentJSONUnmarshaler.Unmarshal(bytes.NewReader(b), m) +} + +var _ json.Unmarshaler = (*UserRoleAssignment)(nil) + // ResourceJSONMarshaler describes the default jsonpb.Marshaler used by all // instances of Resource. This struct is safe to replace or modify but // should not be done so concurrently. @@ -1086,6 +1577,42 @@ func (m *ListOption) UnmarshalJSON(b []byte) error { var _ json.Unmarshaler = (*ListOption)(nil) +// PermissionJSONMarshaler describes the default jsonpb.Marshaler used by all +// instances of Permission. This struct is safe to replace or modify but +// should not be done so concurrently. +var PermissionJSONMarshaler = new(jsonpb.Marshaler) + +// MarshalJSON satisfies the encoding/json Marshaler interface. This method +// uses the more correct jsonpb package to correctly marshal the message. +func (m *Permission) MarshalJSON() ([]byte, error) { + if m == nil { + return json.Marshal(nil) + } + + buf := &bytes.Buffer{} + + if err := PermissionJSONMarshaler.Marshal(buf, m); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +var _ json.Marshaler = (*Permission)(nil) + +// PermissionJSONUnmarshaler describes the default jsonpb.Unmarshaler used by all +// instances of Permission. This struct is safe to replace or modify but +// should not be done so concurrently. +var PermissionJSONUnmarshaler = new(jsonpb.Unmarshaler) + +// UnmarshalJSON satisfies the encoding/json Unmarshaler interface. This method +// uses the more correct jsonpb package to correctly unmarshal the message. +func (m *Permission) UnmarshalJSON(b []byte) error { + return PermissionJSONUnmarshaler.Unmarshal(bytes.NewReader(b), m) +} + +var _ json.Unmarshaler = (*Permission)(nil) + // ValueJSONMarshaler describes the default jsonpb.Marshaler used by all // instances of Value. This struct is safe to replace or modify but // should not be done so concurrently. diff --git a/pkg/proto/v0/settings.swagger.json b/pkg/proto/v0/settings.swagger.json index edb77f84e..69e8ea29f 100644 --- a/pkg/proto/v0/settings.swagger.json +++ b/pkg/proto/v0/settings.swagger.json @@ -24,6 +24,102 @@ "application/json" ], "paths": { + "/api/v0/settings/assignments-add": { + "post": { + "operationId": "RoleService_AssignRoleToUser", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/protoAssignRoleToUserResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/protoAssignRoleToUserRequest" + } + } + ], + "tags": [ + "RoleService" + ] + } + }, + "/api/v0/settings/assignments-list": { + "post": { + "operationId": "RoleService_ListRoleAssignments", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/protoListRoleAssignmentsResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/protoListRoleAssignmentsRequest" + } + } + ], + "tags": [ + "RoleService" + ] + } + }, + "/api/v0/settings/assignments-remove": { + "post": { + "operationId": "RoleService_RemoveRoleFromUser", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "properties": {} + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/protoRemoveRoleFromUserRequest" + } + } + ], + "tags": [ + "RoleService" + ] + } + }, "/api/v0/settings/bundle-get": { "post": { "operationId": "BundleService_GetBundle", @@ -88,6 +184,38 @@ ] } }, + "/api/v0/settings/bundles-add-setting": { + "post": { + "operationId": "BundleService_AddSettingToBundle", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/protoAddSettingToBundleResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/protoAddSettingToBundleRequest" + } + } + ], + "tags": [ + "BundleService" + ] + } + }, "/api/v0/settings/bundles-list": { "post": { "operationId": "BundleService_ListBundles", @@ -120,6 +248,70 @@ ] } }, + "/api/v0/settings/bundles-remove-setting": { + "post": { + "operationId": "BundleService_RemoveSettingFromBundle", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "properties": {} + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/protoRemoveSettingFromBundleRequest" + } + } + ], + "tags": [ + "BundleService" + ] + } + }, + "/api/v0/settings/roles-list": { + "post": { + "operationId": "RoleService_ListRoles", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/protoListBundlesResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/protoListBundlesRequest" + } + } + ], + "tags": [ + "RoleService" + ] + } + }, "/api/v0/settings/value-get": { "post": { "operationId": "ValueService_GetValue", @@ -250,6 +442,55 @@ } }, "definitions": { + "PermissionConstraint": { + "type": "string", + "enum": [ + "CONSTRAINT_UNKNOWN", + "CONSTRAINT_OWN", + "CONSTRAINT_SHARED", + "CONSTRAINT_ALL" + ], + "default": "CONSTRAINT_UNKNOWN" + }, + "protoAddSettingToBundleRequest": { + "type": "object", + "properties": { + "bundle_id": { + "type": "string" + }, + "setting": { + "$ref": "#/definitions/protoSetting" + } + } + }, + "protoAddSettingToBundleResponse": { + "type": "object", + "properties": { + "setting": { + "$ref": "#/definitions/protoSetting" + } + } + }, + "protoAssignRoleToUserRequest": { + "type": "object", + "properties": { + "account_uuid": { + "type": "string" + }, + "role_id": { + "type": "string", + "title": "the role_id is a bundle_id internally" + } + } + }, + "protoAssignRoleToUserResponse": { + "type": "object", + "properties": { + "assignment": { + "$ref": "#/definitions/protoUserRoleAssignment" + } + } + }, "protoBool": { "type": "object", "properties": { @@ -427,6 +668,25 @@ } } }, + "protoListRoleAssignmentsRequest": { + "type": "object", + "properties": { + "account_uuid": { + "type": "string" + } + } + }, + "protoListRoleAssignmentsResponse": { + "type": "object", + "properties": { + "assignments": { + "type": "array", + "items": { + "$ref": "#/definitions/protoUserRoleAssignment" + } + } + } + }, "protoListValue": { "type": "object", "properties": { @@ -471,6 +731,47 @@ } } }, + "protoPermission": { + "type": "object", + "properties": { + "operation": { + "$ref": "#/definitions/protoPermissionOperation" + }, + "constraint": { + "$ref": "#/definitions/PermissionConstraint" + } + } + }, + "protoPermissionOperation": { + "type": "string", + "enum": [ + "OPERATION_UNKNOWN", + "OPERATION_CREATE", + "OPERATION_READ", + "OPERATION_UPDATE", + "OPERATION_DELETE" + ], + "default": "OPERATION_UNKNOWN" + }, + "protoRemoveRoleFromUserRequest": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + } + }, + "protoRemoveSettingFromBundleRequest": { + "type": "object", + "properties": { + "bundle_id": { + "type": "string" + }, + "setting_id": { + "type": "string" + } + } + }, "protoResource": { "type": "object", "properties": { @@ -519,8 +820,7 @@ "value": { "$ref": "#/definitions/protoValue" } - }, - "title": "requests and responses for settings values" + } }, "protoSaveValueResponse": { "type": "object", @@ -560,6 +860,9 @@ "multi_choice_value": { "$ref": "#/definitions/protoMultiChoiceList" }, + "permission_value": { + "$ref": "#/definitions/protoPermission" + }, "resource": { "$ref": "#/definitions/protoResource" } @@ -599,6 +902,22 @@ } } }, + "protoUserRoleAssignment": { + "type": "object", + "properties": { + "id": { + "type": "string", + "title": "id is generated upon saving the assignment" + }, + "account_uuid": { + "type": "string" + }, + "role_id": { + "type": "string", + "title": "the role_id is a bundle_id internally" + } + } + }, "protoValue": { "type": "object", "properties": { diff --git a/pkg/server/grpc/server.go b/pkg/server/grpc/server.go index fa210b4d6..900d6aa73 100644 --- a/pkg/server/grpc/server.go +++ b/pkg/server/grpc/server.go @@ -28,6 +28,9 @@ func Server(opts ...Option) grpc.Service { if err := proto.RegisterValueServiceHandler(service.Server(), handle); err != nil { options.Logger.Fatal().Err(err).Msg("could not register SettingsValues service handler") } + if err := proto.RegisterRoleServiceHandler(service.Server(), handle); err != nil { + options.Logger.Fatal().Err(err).Msg("could not register SettingsRoles service handler") + } service.Init() return service diff --git a/pkg/server/http/server.go b/pkg/server/http/server.go index 1c73f17e6..5df212357 100644 --- a/pkg/server/http/server.go +++ b/pkg/server/http/server.go @@ -65,6 +65,7 @@ func Server(opts ...Option) http.Service { mux.Route(options.Config.HTTP.Root, func(r chi.Router) { proto.RegisterBundleServiceWeb(r, handle) proto.RegisterValueServiceWeb(r, handle) + proto.RegisterRoleServiceWeb(r, handle) }) service.Handle( diff --git a/pkg/service/v0/service.go b/pkg/service/v0/service.go index 706beaa45..7d185213e 100644 --- a/pkg/service/v0/service.go +++ b/pkg/service/v0/service.go @@ -2,6 +2,7 @@ package svc import ( "context" + "github.com/golang/protobuf/ptypes/empty" "github.com/owncloud/ocis-pkg/v2/log" "github.com/owncloud/ocis-pkg/v2/middleware" @@ -69,6 +70,28 @@ func (g Service) ListBundles(c context.Context, req *proto.ListBundlesRequest, r return nil } +// AddSettingToBundle implements the BundleServiceHandler interface +func (g Service) AddSettingToBundle(c context.Context, req *proto.AddSettingToBundleRequest, res *proto.AddSettingToBundleResponse) error { + cleanUpResource(c, req.Setting.Resource) + if validationError := validateAddSettingToBundle(req); validationError != nil { + return validationError + } + r, err := g.manager.AddSettingToBundle(req.BundleId, req.Setting) + if err != nil { + return err + } + res.Setting = r + return nil +} + +// RemoveSettingFromBundle implements the BundleServiceHandler interface +func (g Service) RemoveSettingFromBundle(c context.Context, req *proto.RemoveSettingFromBundleRequest, _ *empty.Empty) error { + if validationError := validateRemoveSettingFromBundle(req); validationError != nil { + return validationError + } + return g.manager.RemoveSettingFromBundle(req.BundleId, req.SettingId) +} + // SaveValue implements the ValueServiceHandler interface func (g Service) SaveValue(c context.Context, req *proto.SaveValueRequest, res *proto.SaveValueResponse) error { req.Value.AccountUuid = getValidatedAccountUUID(c, req.Value.AccountUuid) @@ -164,6 +187,56 @@ func (g Service) getValueWithIdentifier(value *proto.Value) (*proto.ValueWithIde }, nil } +// ListRoles implements the RoleServiceHandler interface +func (g Service) ListRoles(c context.Context, req *proto.ListBundlesRequest, res *proto.ListBundlesResponse) error { + req.AccountUuid = getValidatedAccountUUID(c, req.AccountUuid) + if validationError := validateListRoles(req); validationError != nil { + return validationError + } + r, err := g.manager.ListBundles(proto.Bundle_TYPE_ROLE) + if err != nil { + return err + } + res.Bundles = r + return nil +} + +// ListRoleAssignments implements the RoleServiceHandler interface +func (g Service) ListRoleAssignments(c context.Context, req *proto.ListRoleAssignmentsRequest, res *proto.ListRoleAssignmentsResponse) error { + req.AccountUuid = getValidatedAccountUUID(c, req.AccountUuid) + if validationError := validateListRoleAssignments(req); validationError != nil { + return validationError + } + r, err := g.manager.ListRoleAssignments(req.AccountUuid) + if err != nil { + return err + } + res.Assignments = r + return nil +} + +// AssignRoleToUser implements the RoleServiceHandler interface +func (g Service) AssignRoleToUser(c context.Context, req *proto.AssignRoleToUserRequest, res *proto.AssignRoleToUserResponse) error { + req.AccountUuid = getValidatedAccountUUID(c, req.AccountUuid) + if validationError := validateAssignRoleToUser(req); validationError != nil { + return validationError + } + r, err := g.manager.WriteRoleAssignment(req.AccountUuid, req.RoleId) + if err != nil { + return err + } + res.Assignment = r + return nil +} + +// RemoveRoleFromUser implements the RoleServiceHandler interface +func (g Service) RemoveRoleFromUser(c context.Context, req *proto.RemoveRoleFromUserRequest, _ *empty.Empty) error { + if validationError := validateRemoveRoleFromUser(req); validationError != nil { + return validationError + } + return g.manager.RemoveRoleAssignment(req.Id) +} + // cleanUpResource makes sure that the account uuid of the authenticated user is injected if needed. func cleanUpResource(c context.Context, resource *proto.Resource) { if resource != nil && resource.Type == proto.Resource_TYPE_USER { diff --git a/pkg/service/v0/validator.go b/pkg/service/v0/validator.go index b43c2168a..b2494c892 100644 --- a/pkg/service/v0/validator.go +++ b/pkg/service/v0/validator.go @@ -11,7 +11,7 @@ import ( var ( regexForAccountUUID = regexp.MustCompile(`^[A-Za-z0-9\-_.+@]+$`) requireAccountID = []validation.Rule{ - validation.Required, // use rule for validation error message consistency (".. must not be blank" on empty strings) + validation.Required,// use rule for validation error message consistency (".. must not be blank" on empty strings) validation.Match(regexForAccountUUID), } regexForKeys = regexp.MustCompile(`^[A-Za-z0-9\-_]*$`) @@ -52,6 +52,24 @@ func validateListBundles(req *proto.ListBundlesRequest) error { return validation.Validate(&req.AccountUuid, requireAccountID...) } +func validateAddSettingToBundle(req *proto.AddSettingToBundleRequest) error { + if err := validation.ValidateStruct( + req, + validation.Field(&req.BundleId, is.UUID), + ); err != nil { + return err + } + return validateSetting(req.Setting) +} + +func validateRemoveSettingFromBundle(req *proto.RemoveSettingFromBundleRequest) error { + return validation.ValidateStruct( + req, + validation.Field(&req.BundleId, is.UUID), + validation.Field(&req.SettingId, is.UUID), + ) +} + func validateSaveValue(req *proto.SaveValueRequest) error { if err := validation.ValidateStruct( req.Value, @@ -83,6 +101,29 @@ func validateListValues(req *proto.ListValuesRequest) error { ) } +func validateListRoles(req *proto.ListBundlesRequest) error { + return validation.Validate(&req.AccountUuid, requireAccountID...) +} + +func validateListRoleAssignments(req *proto.ListRoleAssignmentsRequest) error { + return validation.Validate(req.AccountUuid, requireAccountID...) +} + +func validateAssignRoleToUser(req *proto.AssignRoleToUserRequest) error { + return validation.ValidateStruct( + req, + validation.Field(&req.AccountUuid, requireAccountID...), + validation.Field(&req.RoleId, is.UUID), + ) +} + +func validateRemoveRoleFromUser(req *proto.RemoveRoleFromUserRequest) error { + return validation.ValidateStruct( + req, + validation.Field(&req.Id, is.UUID), + ) +} + // validateResource is an internal helper for validating the content of a resource. func validateResource(resource *proto.Resource) error { if err := validation.Validate(&resource, validation.Required); err != nil { diff --git a/pkg/settings/settings.go b/pkg/settings/settings.go index 42556f984..ca8ade6fb 100644 --- a/pkg/settings/settings.go +++ b/pkg/settings/settings.go @@ -17,6 +17,7 @@ type RegisterFunc func(*config.Config) Manager type Manager interface { BundleManager ValueManager + RoleAssignmentManager } // BundleManager is a bundle service interface for abstraction of storage implementations @@ -25,6 +26,8 @@ type BundleManager interface { ReadBundle(bundleID string) (*proto.Bundle, error) WriteBundle(bundle *proto.Bundle) (*proto.Bundle, error) ReadSetting(settingID string) (*proto.Setting, error) + AddSettingToBundle(bundleID string, setting *proto.Setting) (*proto.Setting, error) + RemoveSettingFromBundle(bundleID, settingID string) error } // ValueManager is a value service interface for abstraction of storage implementations @@ -34,3 +37,10 @@ type ValueManager interface { ReadValueByUniqueIdentifiers(accountUUID, settingID string) (*proto.Value, error) WriteValue(value *proto.Value) (*proto.Value, error) } + +// RoleAssignmentManager is a role assignment service interface for abstraction of storage implementations +type RoleAssignmentManager interface { + ListRoleAssignments(accountUUID string) ([]*proto.UserRoleAssignment, error) + WriteRoleAssignment(accountUUID, roleID string) (*proto.UserRoleAssignment, error) + RemoveRoleAssignment(assignmentID string) error +} diff --git a/pkg/store/filesystem/assignments.go b/pkg/store/filesystem/assignments.go new file mode 100644 index 000000000..eb475ef6a --- /dev/null +++ b/pkg/store/filesystem/assignments.go @@ -0,0 +1,68 @@ +// Package store implements the go-micro store interface +package store + +import ( + "io/ioutil" + "os" + "path/filepath" + + "github.com/gofrs/uuid" + "github.com/owncloud/ocis-settings/pkg/proto/v0" +) + +// ListRoleAssignments loads and returns all role assignments matching the given assignment identifier. +func (s Store) ListRoleAssignments(accountUUID string) ([]*proto.UserRoleAssignment, error) { + var records []*proto.UserRoleAssignment + assignmentsFolder := s.buildFolderPathForRoleAssignments(false) + assignmentFiles, err := ioutil.ReadDir(assignmentsFolder) + if err != nil { + s.Logger.Error().Err(err).Str("assignmentFiles", assignmentsFolder).Msg("error reading assignment file") + return records, nil + } + + for _, assignmentFile := range assignmentFiles { + record := proto.UserRoleAssignment{} + err = s.parseRecordFromFile(&record, filepath.Join(assignmentsFolder, assignmentFile.Name())) + if err == nil { + if record.AccountUuid == accountUUID { + records = append(records, &record) + } + } + } + + return records, nil +} + +// WriteRoleAssignment appends the given role assignment to the existing assignments of the respective account. +func (s Store) WriteRoleAssignment(accountUUID, roleID string) (*proto.UserRoleAssignment, error) { + // as per https://jira.owncloud.com/browse/OCIS-117 "Each user can have exactly one role" + list, err := s.ListRoleAssignments(accountUUID) + if err != nil { + return nil, err + } + if len(list) > 0 { + filePath := s.buildFilePathForRoleAssignment(list[0].Id, true) + if err := os.Remove(filePath); err != nil { + return nil, err + } + } + + assignment := &proto.UserRoleAssignment{ + Id: uuid.Must(uuid.NewV4()).String(), + AccountUuid: accountUUID, + RoleId: roleID, + } + filePath := s.buildFilePathForRoleAssignment(assignment.Id, true) + if err := s.writeRecordToFile(assignment, filePath); err != nil { + return nil, err + } + + s.Logger.Debug().Msgf("request contents written to file: %v", filePath) + return assignment, nil +} + +// RemoveRoleAssignment deletes the given role assignment from the existing assignments of the respective account. +func (s Store) RemoveRoleAssignment(assignmentID string) error { + filePath := s.buildFilePathForRoleAssignment(assignmentID, false) + return os.Remove(filePath) +} diff --git a/pkg/store/filesystem/assignments_test.go b/pkg/store/filesystem/assignments_test.go new file mode 100644 index 000000000..25a0c652b --- /dev/null +++ b/pkg/store/filesystem/assignments_test.go @@ -0,0 +1,178 @@ +package store + +import ( + "errors" + "log" + "os" + "path/filepath" + "testing" + + olog "github.com/owncloud/ocis-pkg/v2/log" + "github.com/owncloud/ocis-settings/pkg/proto/v0" + "github.com/stretchr/testify/assert" +) + +var ( + einstein = "a4d07560-a670-4be9-8d60-9b547751a208" + marie = "3c054db3-eec1-4ca4-b985-bc56dcf560cb" + + s = Store{ + dataPath: dataRoot, + Logger: logger, + } + + logger = olog.NewLogger( + olog.Color(true), + olog.Pretty(true), + olog.Level("info"), + ) + + bundles = []*proto.Bundle{ + { + Id: "f36db5e6-a03c-40df-8413-711c67e40b47", + Type: proto.Bundle_TYPE_ROLE, + DisplayName: "test role - reads | update", + Name: "TEST_ROLE", + Extension: "ocis-settings", + Resource: &proto.Resource{ + Type: proto.Resource_TYPE_BUNDLE, + }, + Settings: []*proto.Setting{ + { + Name: "update", + Value: &proto.Setting_PermissionValue{ + PermissionValue: &proto.Permission{ + Operation: proto.Permission_OPERATION_UPDATE, + }, + }, + }, + { + Name: "read", + Value: &proto.Setting_PermissionValue{ + PermissionValue: &proto.Permission{ + Operation: proto.Permission_OPERATION_READ, + }, + }, + }, + }, + }, + { + Id: "44f1a664-0a7f-461a-b0be-5b59e46bbc7a", + Type: proto.Bundle_TYPE_ROLE, + DisplayName: "another", + Name: "ANOTHER_TEST_ROLE", + Extension: "ocis-settings", + Resource: &proto.Resource{ + Type: proto.Resource_TYPE_BUNDLE, + }, + Settings: []*proto.Setting{ + { + Name: "read", + Value: &proto.Setting_PermissionValue{ + PermissionValue: &proto.Permission{ + Operation: proto.Permission_OPERATION_READ, + }, + }, + }, + }, + }, + } +) + +func init() { + setupRoles() +} + +func setupRoles() { + for i := range bundles { + if _, err := s.WriteBundle(bundles[i]); err != nil { + log.Fatal(err) + } + } +} + +func TestAssignmentUniqueness(t *testing.T) { + var scenarios = []struct { + name string + userID string + firstRole string + secondRole string + }{ + { + "roles assignments", + einstein, + "f36db5e6-a03c-40df-8413-711c67e40b47", + "44f1a664-0a7f-461a-b0be-5b59e46bbc7a", + }, + } + + for _, scenario := range scenarios { + scenario := scenario + t.Run(scenario.name, func(t *testing.T) { + firstAssignment, err := s.WriteRoleAssignment(scenario.userID, scenario.firstRole) + assert.NoError(t, err) + assert.Equal(t, firstAssignment.RoleId, scenario.firstRole) + assert.FileExists(t, filepath.Join(dataRoot, "assignments", firstAssignment.Id+".json")) + + list, err := s.ListRoleAssignments(scenario.userID) + assert.NoError(t, err) + assert.Equal(t, 1, len(list)) + + // creating another assignment shouldn't add another entry, as we support max one role per user. + secondAssignment, err := s.WriteRoleAssignment(scenario.userID, scenario.secondRole) + assert.NoError(t, err) + assert.Equal(t, 1, len(list)) + + // assigning the second role should remove the old file and create a new one. + list, err = s.ListRoleAssignments(scenario.userID) + assert.NoError(t, err) + assert.Equal(t, 1, len(list)) + assert.Equal(t, secondAssignment.RoleId, scenario.secondRole) + assert.NoFileExists(t, filepath.Join(dataRoot, "assignments", firstAssignment.Id+".json")) + assert.FileExists(t, filepath.Join(dataRoot, "assignments", secondAssignment.Id+".json")) + }) + } + burnRoot() +} + +func TestDeleteAssignment(t *testing.T) { + var scenarios = []struct { + name string + userID string + firstRole string + secondRole string + }{ + { + "roles assignments", + einstein, + "f36db5e6-a03c-40df-8413-711c67e40b47", + "44f1a664-0a7f-461a-b0be-5b59e46bbc7a", + }, + } + + for _, scenario := range scenarios { + scenario := scenario + t.Run(scenario.name, func(t *testing.T) { + assignment, err := s.WriteRoleAssignment(scenario.userID, scenario.firstRole) + assert.NoError(t, err) + assert.Equal(t, assignment.RoleId, scenario.firstRole) + assert.FileExists(t, filepath.Join(dataRoot, "assignments", assignment.Id+".json")) + + list, err := s.ListRoleAssignments(scenario.userID) + assert.NoError(t, err) + assert.Equal(t, 1, len(list)) + + err = s.RemoveRoleAssignment(assignment.Id) + assert.NoError(t, err) + + list, err = s.ListRoleAssignments(scenario.userID) + assert.NoError(t, err) + assert.Equal(t, 0, len(list)) + + err = s.RemoveRoleAssignment(assignment.Id) + merr := &os.PathError{} + assert.Equal(t, true, errors.As(err, &merr)) + }) + } + burnRoot() +} diff --git a/pkg/store/filesystem/bundles.go b/pkg/store/filesystem/bundles.go index 554d6c0b4..73d4adb03 100644 --- a/pkg/store/filesystem/bundles.go +++ b/pkg/store/filesystem/bundles.go @@ -95,3 +95,67 @@ func (s Store) WriteBundle(record *proto.Bundle) (*proto.Bundle, error) { s.Logger.Debug().Msgf("request contents written to file: %v", filePath) return record, nil } + +// AddSettingToBundle adds the given setting to the bundle with the given bundleID. +func (s Store) AddSettingToBundle(bundleID string, setting *proto.Setting) (*proto.Setting, error) { + bundle, err := s.ReadBundle(bundleID) + if err != nil { + return nil, err + } + if setting.Id == "" { + setting.Id = uuid.Must(uuid.NewV4()).String() + } + setSetting(bundle, setting) + _, err = s.WriteBundle(bundle) + if err != nil { + return nil, err + } + return setting, nil +} + +// RemoveSettingFromBundle removes the setting from the bundle with the given ids. +func (s Store) RemoveSettingFromBundle(bundleID string, settingID string) error { + bundle, err := s.ReadBundle(bundleID) + if err != nil { + return nil + } + removeSetting(bundle, settingID) + _, err = s.WriteBundle(bundle) + return err +} + +// indexOfSetting finds the index of the given setting within the given bundle. +// returns -1 if the setting was not found. +func indexOfSetting(bundle *proto.Bundle, settingID string) int { + for index := range bundle.Settings { + s := bundle.Settings[index] + if s.Id == settingID { + return index + } + } + return -1 +} + +// setSetting will append or overwrite the given setting within the given bundle +func setSetting(bundle *proto.Bundle, setting *proto.Setting) { + m.Lock() + defer m.Unlock() + index := indexOfSetting(bundle, setting.Id) + if index == -1 { + bundle.Settings = append(bundle.Settings, setting) + } else { + bundle.Settings[index] = setting + } +} + +// removeSetting will remove the given setting from the given bundle +func removeSetting(bundle *proto.Bundle, settingID string) bool { + m.Lock() + defer m.Unlock() + index := indexOfSetting(bundle, settingID) + if index == -1 { + return false + } + bundle.Settings = append(bundle.Settings[:index], bundle.Settings[index+1:]...) + return true +} diff --git a/pkg/store/filesystem/bundles_test.go b/pkg/store/filesystem/bundles_test.go index 96c90f8db..2c09ae20d 100644 --- a/pkg/store/filesystem/bundles_test.go +++ b/pkg/store/filesystem/bundles_test.go @@ -70,6 +70,35 @@ var bundleScenarios = []struct { }, }, }, + { + name: "generic-test-role-bundle", + bundle: &proto.Bundle{ + Id: bundle3, + Type: proto.Bundle_TYPE_ROLE, + Extension: extension1, + DisplayName: "Role1", + Resource: &proto.Resource{ + Type: proto.Resource_TYPE_SYSTEM, + }, + Settings: []*proto.Setting{ + { + Id: setting3, + Description: "test-desc-3", + DisplayName: "test-displayname-3", + Resource: &proto.Resource{ + Type: proto.Resource_TYPE_SETTING, + Id: setting1, + }, + Value: &proto.Setting_PermissionValue{ + PermissionValue: &proto.Permission{ + Operation: proto.Permission_OPERATION_READ, + Constraint: proto.Permission_CONSTRAINT_OWN, + }, + }, + }, + }, + }, + }, } func TestBundles(t *testing.T) { diff --git a/pkg/store/filesystem/paths.go b/pkg/store/filesystem/paths.go index e7840a1d5..d6d21e89c 100644 --- a/pkg/store/filesystem/paths.go +++ b/pkg/store/filesystem/paths.go @@ -7,6 +7,7 @@ import ( const folderNameBundles = "bundles" const folderNameValues = "values" +const folderNameAssignments = "assignments" // buildFolderPathForBundles builds the folder path for storing settings bundles. If mkdir is true, folders in the path will be created if necessary. func (s Store) buildFolderPathForBundles(mkdir bool) string { @@ -38,6 +39,21 @@ func (s Store) buildFilePathForValue(valueID string, mkdir bool) string { return filepath.Join(extensionFolder, valueID+".json") } +// buildFolderPathForRoleAssignments builds the folder path for storing role assignments. If mkdir is true, folders in the path will be created if necessary. +func (s Store) buildFolderPathForRoleAssignments(mkdir bool) string { + roleAssignmentsFolder := filepath.Join(s.dataPath, folderNameAssignments) + if mkdir { + s.ensureFolderExists(roleAssignmentsFolder) + } + return roleAssignmentsFolder +} + +// buildFilePathForRoleAssignment builds a unique file name from the given params. If mkdir is true, folders in the path will be created if necessary. +func (s Store) buildFilePathForRoleAssignment(assignmentID string, mkdir bool) string { + roleAssignmentsFolder := s.buildFolderPathForRoleAssignments(mkdir) + return filepath.Join(roleAssignmentsFolder, assignmentID+".json") +} + // ensureFolderExists checks if the given path is an existing folder and creates one if not existing func (s Store) ensureFolderExists(path string) { if _, err := os.Stat(path); os.IsNotExist(err) { diff --git a/pkg/store/filesystem/store_test.go b/pkg/store/filesystem/store_test.go index 5f15c35d4..5f3becdf3 100644 --- a/pkg/store/filesystem/store_test.go +++ b/pkg/store/filesystem/store_test.go @@ -18,12 +18,12 @@ const ( // bundle ids bundle1 = "2f06addf-4fd2-49d5-8f71-00fbd3a3ec47" bundle2 = "2d745744-749c-4286-8e92-74a24d8331c5" - //bundle3 = "d8fd27d1-c00b-4794-a658-416b756a72ff" + bundle3 = "d8fd27d1-c00b-4794-a658-416b756a72ff" // setting ids setting1 = "c7ebbc8b-d15a-4f2e-9d7d-d6a4cf858d1a" setting2 = "3fd9a3d9-20b7-40d4-9294-b22bb5868c10" - //setting3 = "24bb9535-3df4-42f1-a622-7c0562bec99f" + setting3 = "24bb9535-3df4-42f1-a622-7c0562bec99f" // value ids value1 = "fd3b6221-dc13-4a22-824d-2480495f1cdb"