From c162b67fae90fb6af6f9d21f203e6577fc91cda3 Mon Sep 17 00:00:00 2001 From: Nick Zelei <2420177+nickzelei@users.noreply.github.com> Date: Fri, 24 May 2024 14:04:56 -0700 Subject: [PATCH] NEOS-1100 add support for client certificates to postgres (#2019) --- .../go/protos/mgmt/v1alpha1/connection.pb.go | 777 ++++++++++-------- .../mgmt/v1alpha1/connection.pb.validate.go | 141 ++++ backend/pkg/sqlconnect/pgpool.go | 4 +- backend/pkg/sqlconnect/sql-connector.go | 147 +++- backend/pkg/sqlconnect/sql-connector_test.go | 4 + backend/pkg/sqlconnect/sqldb.go | 1 + backend/protos/mgmt/v1alpha1/connection.proto | 14 + backend/sql/postgresql/models/models.go | 37 + docs/protos/data/proto_docs.json | 62 +- .../[id]/components/PostgresForm.tsx | 101 ++- .../[id]/components/connection-component.tsx | 11 + .../new/connection/postgres/PostgresForm.tsx | 104 ++- .../connections/postgres/check/route.ts | 15 +- .../apps/web/yup-validations/connections.ts | 8 + .../src/client/mgmt/v1alpha1/connection_pb.ts | 67 ++ .../datasync/activities/sync/conn-tunnel.go | 2 +- 16 files changed, 1133 insertions(+), 362 deletions(-) diff --git a/backend/gen/go/protos/mgmt/v1alpha1/connection.pb.go b/backend/gen/go/protos/mgmt/v1alpha1/connection.pb.go index 43f31264c2..94a6bd3fc6 100644 --- a/backend/gen/go/protos/mgmt/v1alpha1/connection.pb.go +++ b/backend/gen/go/protos/mgmt/v1alpha1/connection.pb.go @@ -1053,6 +1053,8 @@ type PostgresConnectionConfig struct { // Provide tunnel configuration that can be used to access a postgres connection that is not publicly accessible to the internet Tunnel *SSHTunnel `protobuf:"bytes,3,opt,name=tunnel,proto3" json:"tunnel,omitempty"` ConnectionOptions *SqlConnectionOptions `protobuf:"bytes,4,opt,name=connection_options,json=connectionOptions,proto3" json:"connection_options,omitempty"` + // Provide client-side TLS Certificates + ClientTls *ClientTlsConfig `protobuf:"bytes,5,opt,name=client_tls,json=clientTls,proto3" json:"client_tls,omitempty"` } func (x *PostgresConnectionConfig) Reset() { @@ -1122,6 +1124,13 @@ func (x *PostgresConnectionConfig) GetConnectionOptions() *SqlConnectionOptions return nil } +func (x *PostgresConnectionConfig) GetClientTls() *ClientTlsConfig { + if x != nil { + return x.ClientTls + } + return nil +} + type isPostgresConnectionConfig_ConnectionConfig interface { isPostgresConnectionConfig_ConnectionConfig() } @@ -1138,18 +1147,86 @@ func (*PostgresConnectionConfig_Url) isPostgresConnectionConfig_ConnectionConfig func (*PostgresConnectionConfig_Connection) isPostgresConnectionConfig_ConnectionConfig() {} +// Config for providing client-side TLS certificates +type ClientTlsConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Root Certificate in PEM Format + RootCert *string `protobuf:"bytes,1,opt,name=root_cert,json=rootCert,proto3,oneof" json:"root_cert,omitempty"` + // Client Certificate in PEM format. Must also provide key. + ClientCert *string `protobuf:"bytes,2,opt,name=client_cert,json=clientCert,proto3,oneof" json:"client_cert,omitempty"` + // Client Key in PEM format. Must also provide cert. + ClientKey *string `protobuf:"bytes,3,opt,name=client_key,json=clientKey,proto3,oneof" json:"client_key,omitempty"` +} + +func (x *ClientTlsConfig) Reset() { + *x = ClientTlsConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClientTlsConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClientTlsConfig) ProtoMessage() {} + +func (x *ClientTlsConfig) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_connection_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 ClientTlsConfig.ProtoReflect.Descriptor instead. +func (*ClientTlsConfig) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{18} +} + +func (x *ClientTlsConfig) GetRootCert() string { + if x != nil && x.RootCert != nil { + return *x.RootCert + } + return "" +} + +func (x *ClientTlsConfig) GetClientCert() string { + if x != nil && x.ClientCert != nil { + return *x.ClientCert + } + return "" +} + +func (x *ClientTlsConfig) GetClientKey() string { + if x != nil && x.ClientKey != nil { + return *x.ClientKey + } + return "" +} + type SqlConnectionOptions struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + // Limits the number of open connections in the pool. MaxConnectionLimit *int32 `protobuf:"varint,1,opt,name=max_connection_limit,json=maxConnectionLimit,proto3,oneof" json:"max_connection_limit,omitempty"` } func (x *SqlConnectionOptions) Reset() { *x = SqlConnectionOptions{} if protoimpl.UnsafeEnabled { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[18] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1162,7 +1239,7 @@ func (x *SqlConnectionOptions) String() string { func (*SqlConnectionOptions) ProtoMessage() {} func (x *SqlConnectionOptions) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[18] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1175,7 +1252,7 @@ func (x *SqlConnectionOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use SqlConnectionOptions.ProtoReflect.Descriptor instead. func (*SqlConnectionOptions) Descriptor() ([]byte, []int) { - return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{18} + return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{19} } func (x *SqlConnectionOptions) GetMaxConnectionLimit() int32 { @@ -1207,7 +1284,7 @@ type SSHTunnel struct { func (x *SSHTunnel) Reset() { *x = SSHTunnel{} if protoimpl.UnsafeEnabled { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[19] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1220,7 +1297,7 @@ func (x *SSHTunnel) String() string { func (*SSHTunnel) ProtoMessage() {} func (x *SSHTunnel) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[19] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1233,7 +1310,7 @@ func (x *SSHTunnel) ProtoReflect() protoreflect.Message { // Deprecated: Use SSHTunnel.ProtoReflect.Descriptor instead. func (*SSHTunnel) Descriptor() ([]byte, []int) { - return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{19} + return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{20} } func (x *SSHTunnel) GetHost() string { @@ -1287,7 +1364,7 @@ type SSHAuthentication struct { func (x *SSHAuthentication) Reset() { *x = SSHAuthentication{} if protoimpl.UnsafeEnabled { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[20] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1300,7 +1377,7 @@ func (x *SSHAuthentication) String() string { func (*SSHAuthentication) ProtoMessage() {} func (x *SSHAuthentication) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[20] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1313,7 +1390,7 @@ func (x *SSHAuthentication) ProtoReflect() protoreflect.Message { // Deprecated: Use SSHAuthentication.ProtoReflect.Descriptor instead. func (*SSHAuthentication) Descriptor() ([]byte, []int) { - return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{20} + return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{21} } func (m *SSHAuthentication) GetAuthConfig() isSSHAuthentication_AuthConfig { @@ -1366,7 +1443,7 @@ type SSHPassphrase struct { func (x *SSHPassphrase) Reset() { *x = SSHPassphrase{} if protoimpl.UnsafeEnabled { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[21] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1379,7 +1456,7 @@ func (x *SSHPassphrase) String() string { func (*SSHPassphrase) ProtoMessage() {} func (x *SSHPassphrase) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[21] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1392,7 +1469,7 @@ func (x *SSHPassphrase) ProtoReflect() protoreflect.Message { // Deprecated: Use SSHPassphrase.ProtoReflect.Descriptor instead. func (*SSHPassphrase) Descriptor() ([]byte, []int) { - return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{21} + return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{22} } func (x *SSHPassphrase) GetValue() string { @@ -1417,7 +1494,7 @@ type SSHPrivateKey struct { func (x *SSHPrivateKey) Reset() { *x = SSHPrivateKey{} if protoimpl.UnsafeEnabled { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[22] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1430,7 +1507,7 @@ func (x *SSHPrivateKey) String() string { func (*SSHPrivateKey) ProtoMessage() {} func (x *SSHPrivateKey) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[22] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1443,7 +1520,7 @@ func (x *SSHPrivateKey) ProtoReflect() protoreflect.Message { // Deprecated: Use SSHPrivateKey.ProtoReflect.Descriptor instead. func (*SSHPrivateKey) Descriptor() ([]byte, []int) { - return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{22} + return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{23} } func (x *SSHPrivateKey) GetValue() string { @@ -1476,7 +1553,7 @@ type PostgresConnection struct { func (x *PostgresConnection) Reset() { *x = PostgresConnection{} if protoimpl.UnsafeEnabled { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[23] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1489,7 +1566,7 @@ func (x *PostgresConnection) String() string { func (*PostgresConnection) ProtoMessage() {} func (x *PostgresConnection) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[23] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1502,7 +1579,7 @@ func (x *PostgresConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use PostgresConnection.ProtoReflect.Descriptor instead. func (*PostgresConnection) Descriptor() ([]byte, []int) { - return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{23} + return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{24} } func (x *PostgresConnection) GetHost() string { @@ -1563,7 +1640,7 @@ type MysqlConnection struct { func (x *MysqlConnection) Reset() { *x = MysqlConnection{} if protoimpl.UnsafeEnabled { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[24] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1576,7 +1653,7 @@ func (x *MysqlConnection) String() string { func (*MysqlConnection) ProtoMessage() {} func (x *MysqlConnection) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[24] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1589,7 +1666,7 @@ func (x *MysqlConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use MysqlConnection.ProtoReflect.Descriptor instead. func (*MysqlConnection) Descriptor() ([]byte, []int) { - return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{24} + return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{25} } func (x *MysqlConnection) GetUser() string { @@ -1654,7 +1731,7 @@ type MysqlConnectionConfig struct { func (x *MysqlConnectionConfig) Reset() { *x = MysqlConnectionConfig{} if protoimpl.UnsafeEnabled { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[25] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1667,7 +1744,7 @@ func (x *MysqlConnectionConfig) String() string { func (*MysqlConnectionConfig) ProtoMessage() {} func (x *MysqlConnectionConfig) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[25] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1680,7 +1757,7 @@ func (x *MysqlConnectionConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use MysqlConnectionConfig.ProtoReflect.Descriptor instead. func (*MysqlConnectionConfig) Descriptor() ([]byte, []int) { - return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{25} + return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{26} } func (m *MysqlConnectionConfig) GetConnectionConfig() isMysqlConnectionConfig_ConnectionConfig { @@ -1751,7 +1828,7 @@ type AwsS3ConnectionConfig struct { func (x *AwsS3ConnectionConfig) Reset() { *x = AwsS3ConnectionConfig{} if protoimpl.UnsafeEnabled { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[26] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1764,7 +1841,7 @@ func (x *AwsS3ConnectionConfig) String() string { func (*AwsS3ConnectionConfig) ProtoMessage() {} func (x *AwsS3ConnectionConfig) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[26] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1777,7 +1854,7 @@ func (x *AwsS3ConnectionConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use AwsS3ConnectionConfig.ProtoReflect.Descriptor instead. func (*AwsS3ConnectionConfig) Descriptor() ([]byte, []int) { - return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{26} + return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{27} } // Deprecated: Marked as deprecated in mgmt/v1alpha1/connection.proto. @@ -1842,7 +1919,7 @@ type AwsS3Credentials struct { func (x *AwsS3Credentials) Reset() { *x = AwsS3Credentials{} if protoimpl.UnsafeEnabled { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[27] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1855,7 +1932,7 @@ func (x *AwsS3Credentials) String() string { func (*AwsS3Credentials) ProtoMessage() {} func (x *AwsS3Credentials) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[27] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1868,7 +1945,7 @@ func (x *AwsS3Credentials) ProtoReflect() protoreflect.Message { // Deprecated: Use AwsS3Credentials.ProtoReflect.Descriptor instead. func (*AwsS3Credentials) Descriptor() ([]byte, []int) { - return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{27} + return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{28} } func (x *AwsS3Credentials) GetProfile() string { @@ -1932,7 +2009,7 @@ type IsConnectionNameAvailableRequest struct { func (x *IsConnectionNameAvailableRequest) Reset() { *x = IsConnectionNameAvailableRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[28] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1945,7 +2022,7 @@ func (x *IsConnectionNameAvailableRequest) String() string { func (*IsConnectionNameAvailableRequest) ProtoMessage() {} func (x *IsConnectionNameAvailableRequest) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[28] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1958,7 +2035,7 @@ func (x *IsConnectionNameAvailableRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use IsConnectionNameAvailableRequest.ProtoReflect.Descriptor instead. func (*IsConnectionNameAvailableRequest) Descriptor() ([]byte, []int) { - return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{28} + return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{29} } func (x *IsConnectionNameAvailableRequest) GetAccountId() string { @@ -1986,7 +2063,7 @@ type IsConnectionNameAvailableResponse struct { func (x *IsConnectionNameAvailableResponse) Reset() { *x = IsConnectionNameAvailableResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[29] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1999,7 +2076,7 @@ func (x *IsConnectionNameAvailableResponse) String() string { func (*IsConnectionNameAvailableResponse) ProtoMessage() {} func (x *IsConnectionNameAvailableResponse) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[29] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2012,7 +2089,7 @@ func (x *IsConnectionNameAvailableResponse) ProtoReflect() protoreflect.Message // Deprecated: Use IsConnectionNameAvailableResponse.ProtoReflect.Descriptor instead. func (*IsConnectionNameAvailableResponse) Descriptor() ([]byte, []int) { - return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{29} + return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{30} } func (x *IsConnectionNameAvailableResponse) GetIsAvailable() bool { @@ -2036,7 +2113,7 @@ type CheckSqlQueryRequest struct { func (x *CheckSqlQueryRequest) Reset() { *x = CheckSqlQueryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[30] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2049,7 +2126,7 @@ func (x *CheckSqlQueryRequest) String() string { func (*CheckSqlQueryRequest) ProtoMessage() {} func (x *CheckSqlQueryRequest) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[30] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2062,7 +2139,7 @@ func (x *CheckSqlQueryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckSqlQueryRequest.ProtoReflect.Descriptor instead. func (*CheckSqlQueryRequest) Descriptor() ([]byte, []int) { - return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{30} + return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{31} } func (x *CheckSqlQueryRequest) GetId() string { @@ -2093,7 +2170,7 @@ type CheckSqlQueryResponse struct { func (x *CheckSqlQueryResponse) Reset() { *x = CheckSqlQueryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[31] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2106,7 +2183,7 @@ func (x *CheckSqlQueryResponse) String() string { func (*CheckSqlQueryResponse) ProtoMessage() {} func (x *CheckSqlQueryResponse) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[31] + mi := &file_mgmt_v1alpha1_connection_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2119,7 +2196,7 @@ func (x *CheckSqlQueryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckSqlQueryResponse.ProtoReflect.Descriptor instead. func (*CheckSqlQueryResponse) Descriptor() ([]byte, []int) { - return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{31} + return file_mgmt_v1alpha1_connection_proto_rawDescGZIP(), []int{32} } func (x *CheckSqlQueryResponse) GetIsValid() bool { @@ -2290,7 +2367,7 @@ var file_mgmt_v1alpha1_connection_proto_rawDesc = []byte{ 0x63, 0x74, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1b, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x22, 0x95, 0x02, 0x0a, 0x18, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x43, + 0x74, 0x68, 0x22, 0xd4, 0x02, 0x0a, 0x18, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x43, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, @@ -2305,229 +2382,244 @@ var file_mgmt_v1alpha1_connection_proto_rawDesc = []byte{ 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x11, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x1a, - 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x05, 0xba, 0x48, 0x02, 0x08, 0x01, 0x22, 0x66, 0x0a, 0x14, 0x53, 0x71, - 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x48, 0x00, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6d, 0x61, - 0x78, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x22, 0x87, 0x02, 0x0a, 0x09, 0x53, 0x53, 0x48, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, - 0x12, 0x1b, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, - 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x1b, 0x0a, - 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xba, 0x48, 0x04, - 0x1a, 0x02, 0x28, 0x00, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x75, 0x73, - 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x15, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, - 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x48, - 0x00, 0x52, 0x12, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x50, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x4b, 0x65, 0x79, 0x88, 0x01, 0x01, 0x12, 0x48, 0x0a, 0x0e, 0x61, 0x75, 0x74, 0x68, - 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x53, 0x53, 0x48, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0e, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x68, 0x6f, 0x73, - 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x22, 0xaa, 0x01, 0x0a, - 0x11, 0x53, 0x53, 0x48, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0a, 0x70, 0x61, 0x73, 0x73, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x53, 0x48, 0x50, 0x61, 0x73, 0x73, 0x70, 0x68, - 0x72, 0x61, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x73, 0x73, 0x70, 0x68, 0x72, 0x61, - 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x53, 0x48, 0x50, 0x72, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x4b, 0x65, 0x79, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x4b, 0x65, 0x79, 0x42, 0x14, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x05, 0xba, 0x48, 0x02, 0x08, 0x01, 0x22, 0x2e, 0x0a, 0x0d, 0x53, 0x53, 0x48, - 0x50, 0x61, 0x73, 0x73, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, - 0x10, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x62, 0x0a, 0x0d, 0x53, 0x53, 0x48, - 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, - 0x10, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0a, 0x70, 0x61, 0x73, - 0x73, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x0a, 0x70, 0x61, 0x73, 0x73, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, - 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x22, 0xa5, 0x01, - 0x0a, 0x12, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x75, 0x73, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x73, 0x73, 0x12, 0x1e, 0x0a, 0x08, 0x73, 0x73, 0x6c, 0x5f, - 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x73, 0x73, - 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x73, 0x73, 0x6c, - 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x0f, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x12, 0x0a, - 0x04, 0x70, 0x61, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x73, - 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, - 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x8f, 0x02, 0x0a, 0x15, 0x4d, 0x79, - 0x73, 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x40, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x67, - 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x79, 0x73, 0x71, - 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x06, 0x74, 0x75, 0x6e, - 0x6e, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x67, 0x6d, 0x74, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x53, 0x48, 0x54, 0x75, 0x6e, - 0x6e, 0x65, 0x6c, 0x52, 0x06, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x52, 0x0a, 0x12, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x11, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, - 0x1a, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x05, 0xba, 0x48, 0x02, 0x08, 0x01, 0x22, 0xbf, 0x02, 0x0a, 0x15, - 0x41, 0x77, 0x73, 0x53, 0x33, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x21, 0x0a, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, - 0x61, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x09, 0x62, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x72, 0x6e, 0x12, 0x24, 0x0a, 0x0b, 0x70, 0x61, 0x74, 0x68, - 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x0a, 0x70, 0x61, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x88, 0x01, 0x01, 0x12, 0x46, - 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x41, 0x77, 0x73, 0x53, 0x33, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x73, 0x48, 0x01, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x61, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, - 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x62, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x70, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x61, 0x6c, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, - 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0xa7, 0x03, - 0x0a, 0x10, 0x41, 0x77, 0x73, 0x53, 0x33, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, - 0x6c, 0x73, 0x12, 0x1d, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x88, 0x01, - 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x73, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x73, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x03, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x65, 0x63, - 0x32, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0b, - 0x66, 0x72, 0x6f, 0x6d, 0x45, 0x63, 0x32, 0x52, 0x6f, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1e, - 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x72, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x05, 0x52, 0x07, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2d, - 0x0a, 0x10, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, - 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x0e, 0x72, 0x6f, 0x6c, 0x65, - 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, - 0x08, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x61, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x14, 0x0a, 0x12, 0x5f, - 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, - 0x79, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x65, 0x63, 0x32, - 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, - 0x72, 0x6e, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x8e, 0x01, 0x0a, 0x20, 0x49, 0x73, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x76, 0x61, 0x69, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0a, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x41, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, - 0xba, 0x48, 0x15, 0x72, 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x2d, - 0x5d, 0x7b, 0x33, 0x2c, 0x33, 0x30, 0x7d, 0x24, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x46, 0x0a, 0x21, 0x49, 0x73, 0x43, 0x6f, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3d, + 0x0a, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x6c, 0x73, 0x42, 0x1a, 0x0a, + 0x11, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x05, 0xba, 0x48, 0x02, 0x08, 0x01, 0x22, 0xaa, 0x01, 0x0a, 0x0f, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x54, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, + 0x09, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x43, 0x65, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, + 0x24, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, + 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x09, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x6f, + 0x6f, 0x74, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x22, 0x66, 0x0a, 0x14, 0x53, 0x71, 0x6c, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, + 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x12, + 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x88, 0x01, 0x01, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x87, + 0x02, 0x0a, 0x09, 0x53, 0x53, 0x48, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x1b, 0x0a, 0x04, + 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, + 0x02, 0x10, 0x01, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x70, 0x6f, 0x72, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xba, 0x48, 0x04, 0x1a, 0x02, 0x28, 0x00, + 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x75, + 0x73, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x15, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x68, 0x6f, 0x73, + 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x48, 0x00, 0x52, 0x12, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, + 0x79, 0x88, 0x01, 0x01, 0x12, 0x48, 0x0a, 0x0e, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, + 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x53, 0x48, + 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, + 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x18, + 0x0a, 0x16, 0x5f, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x22, 0xaa, 0x01, 0x0a, 0x11, 0x53, 0x53, 0x48, + 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, + 0x0a, 0x0a, 0x70, 0x61, 0x73, 0x73, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x53, 0x53, 0x48, 0x50, 0x61, 0x73, 0x73, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, + 0x48, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x73, 0x73, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x12, 0x3f, + 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x53, 0x53, 0x48, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, + 0x79, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x42, + 0x14, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x05, + 0xba, 0x48, 0x02, 0x08, 0x01, 0x22, 0x2e, 0x0a, 0x0d, 0x53, 0x53, 0x48, 0x50, 0x61, 0x73, 0x73, + 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x62, 0x0a, 0x0d, 0x53, 0x53, 0x48, 0x50, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0a, 0x70, 0x61, 0x73, 0x73, 0x70, 0x68, 0x72, + 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x73, + 0x73, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, + 0x61, 0x73, 0x73, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x22, 0xa5, 0x01, 0x0a, 0x12, 0x50, 0x6f, + 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x68, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x75, 0x73, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, + 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x70, 0x61, 0x73, 0x73, 0x12, 0x1e, 0x0a, 0x08, 0x73, 0x73, 0x6c, 0x5f, 0x6d, 0x6f, 0x64, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x73, 0x73, 0x6c, 0x4d, 0x6f, 0x64, + 0x65, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x73, 0x73, 0x6c, 0x5f, 0x6d, 0x6f, 0x64, + 0x65, 0x22, 0x91, 0x01, 0x0a, 0x0f, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x73, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x73, 0x73, 0x12, 0x1a, 0x0a, + 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x8f, 0x02, 0x0a, 0x15, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x12, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, + 0x75, 0x72, 0x6c, 0x12, 0x40, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x06, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x53, 0x48, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, + 0x06, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x52, 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x53, 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x1a, 0x0a, 0x11, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x05, 0xba, 0x48, 0x02, 0x08, 0x01, 0x22, 0xbf, 0x02, 0x0a, 0x15, 0x41, 0x77, 0x73, 0x53, + 0x33, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x21, 0x0a, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x61, 0x72, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x41, 0x72, 0x6e, 0x12, 0x24, 0x0a, 0x0b, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x74, + 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x0b, 0x63, 0x72, + 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1f, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x41, 0x77, 0x73, 0x53, 0x33, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, + 0x48, 0x01, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x88, + 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x02, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, + 0x1f, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x03, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x88, 0x01, 0x01, + 0x12, 0x1f, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x42, 0x0b, 0x0a, 0x09, + 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0xa7, 0x03, 0x0a, 0x10, 0x41, 0x77, + 0x73, 0x53, 0x33, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x1d, + 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, + 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, + 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x02, 0x52, 0x0f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x4b, 0x65, 0x79, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, + 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, + 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x65, 0x63, 0x32, 0x5f, 0x72, 0x6f, + 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0b, 0x66, 0x72, 0x6f, 0x6d, + 0x45, 0x63, 0x32, 0x52, 0x6f, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x72, 0x6f, + 0x6c, 0x65, 0x5f, 0x61, 0x72, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x07, + 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x10, 0x72, 0x6f, + 0x6c, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x42, 0x10, 0x0a, + 0x0e, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x42, + 0x10, 0x0a, 0x0e, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x65, 0x63, 0x32, 0x5f, 0x72, 0x6f, 0x6c, + 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x72, 0x6e, 0x42, 0x13, + 0x0a, 0x11, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x5f, 0x69, 0x64, 0x22, 0x8e, 0x01, 0x0a, 0x20, 0x49, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, + 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x41, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xba, 0x48, 0x15, 0x72, + 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x2d, 0x5d, 0x7b, 0x33, 0x2c, + 0x33, 0x30, 0x7d, 0x24, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x46, 0x0a, 0x21, 0x49, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, + 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x69, 0x73, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x4f, 0x0a, 0x14, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x71, 0x6c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, + 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, + 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x6e, 0x0a, + 0x15, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x71, 0x6c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x12, 0x28, 0x0a, 0x0d, 0x65, 0x72, 0x6f, 0x72, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x65, 0x72, 0x6f, 0x72, + 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, + 0x65, 0x72, 0x6f, 0x72, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0xde, 0x06, + 0x0a, 0x11, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x5f, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x24, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x6d, 0x67, + 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, 0x67, 0x6d, + 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x65, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, + 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x10, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, + 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x65, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6d, + 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x80, 0x01, 0x0a, 0x19, 0x49, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x76, 0x61, 0x69, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, - 0x0c, 0x69, 0x73, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x22, 0x4f, 0x0a, 0x14, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x71, 0x6c, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x22, 0x6e, 0x0a, 0x15, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x71, 0x6c, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, - 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x28, 0x0a, 0x0d, 0x65, 0x72, 0x6f, 0x72, 0x72, 0x5f, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, - 0x65, 0x72, 0x6f, 0x72, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x42, - 0x10, 0x0a, 0x0e, 0x5f, 0x65, 0x72, 0x6f, 0x72, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x32, 0xde, 0x06, 0x0a, 0x11, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5f, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x24, 0x2e, 0x6d, 0x67, 0x6d, 0x74, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x25, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x2e, 0x6d, 0x67, 0x6d, 0x74, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, - 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x6d, 0x67, 0x6d, - 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x65, 0x0a, - 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x26, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x67, 0x6d, 0x74, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x27, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x80, 0x01, 0x0a, 0x19, - 0x49, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, - 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2f, 0x2e, 0x6d, 0x67, 0x6d, 0x74, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x73, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x6d, 0x67, 0x6d, - 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x73, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, - 0x0a, 0x15, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x0d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x71, 0x6c, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x23, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x71, 0x6c, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, 0x67, 0x6d, - 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x53, 0x71, 0x6c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x42, 0xcb, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x0f, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x50, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6e, 0x75, 0x63, 0x6c, 0x65, 0x75, 0x73, 0x63, - 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x6e, 0x65, 0x6f, 0x73, 0x79, 0x6e, 0x63, 0x2f, 0x62, 0x61, 0x63, - 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x73, 0x2f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x3b, 0x6d, 0x67, 0x6d, 0x74, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x03, - 0x4d, 0x58, 0x58, 0xaa, 0x02, 0x0d, 0x4d, 0x67, 0x6d, 0x74, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0xca, 0x02, 0x0d, 0x4d, 0x67, 0x6d, 0x74, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0xe2, 0x02, 0x19, 0x4d, 0x67, 0x6d, 0x74, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, - 0x02, 0x0e, 0x4d, 0x67, 0x6d, 0x74, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2f, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, 0x0a, 0x15, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x2b, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x5c, 0x0a, 0x0d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x71, 0x6c, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x12, 0x23, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x71, 0x6c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x71, 0x6c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0xcb, + 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x42, 0x0f, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x50, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x6e, 0x75, 0x63, 0x6c, 0x65, 0x75, 0x73, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x2f, 0x6e, 0x65, 0x6f, 0x73, 0x79, 0x6e, 0x63, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6d, + 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x6d, 0x67, 0x6d, + 0x74, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x4d, 0x58, 0x58, 0xaa, + 0x02, 0x0d, 0x4d, 0x67, 0x6d, 0x74, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, + 0x02, 0x0d, 0x4d, 0x67, 0x6d, 0x74, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, + 0x02, 0x19, 0x4d, 0x67, 0x6d, 0x74, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, + 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x4d, 0x67, + 0x6d, 0x74, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2542,7 +2634,7 @@ func file_mgmt_v1alpha1_connection_proto_rawDescGZIP() []byte { return file_mgmt_v1alpha1_connection_proto_rawDescData } -var file_mgmt_v1alpha1_connection_proto_msgTypes = make([]protoimpl.MessageInfo, 32) +var file_mgmt_v1alpha1_connection_proto_msgTypes = make([]protoimpl.MessageInfo, 33) var file_mgmt_v1alpha1_connection_proto_goTypes = []interface{}{ (*GetConnectionsRequest)(nil), // 0: mgmt.v1alpha1.GetConnectionsRequest (*GetConnectionsResponse)(nil), // 1: mgmt.v1alpha1.GetConnectionsResponse @@ -2562,21 +2654,22 @@ var file_mgmt_v1alpha1_connection_proto_goTypes = []interface{}{ (*OpenAiConnectionConfig)(nil), // 15: mgmt.v1alpha1.OpenAiConnectionConfig (*LocalDirectoryConnectionConfig)(nil), // 16: mgmt.v1alpha1.LocalDirectoryConnectionConfig (*PostgresConnectionConfig)(nil), // 17: mgmt.v1alpha1.PostgresConnectionConfig - (*SqlConnectionOptions)(nil), // 18: mgmt.v1alpha1.SqlConnectionOptions - (*SSHTunnel)(nil), // 19: mgmt.v1alpha1.SSHTunnel - (*SSHAuthentication)(nil), // 20: mgmt.v1alpha1.SSHAuthentication - (*SSHPassphrase)(nil), // 21: mgmt.v1alpha1.SSHPassphrase - (*SSHPrivateKey)(nil), // 22: mgmt.v1alpha1.SSHPrivateKey - (*PostgresConnection)(nil), // 23: mgmt.v1alpha1.PostgresConnection - (*MysqlConnection)(nil), // 24: mgmt.v1alpha1.MysqlConnection - (*MysqlConnectionConfig)(nil), // 25: mgmt.v1alpha1.MysqlConnectionConfig - (*AwsS3ConnectionConfig)(nil), // 26: mgmt.v1alpha1.AwsS3ConnectionConfig - (*AwsS3Credentials)(nil), // 27: mgmt.v1alpha1.AwsS3Credentials - (*IsConnectionNameAvailableRequest)(nil), // 28: mgmt.v1alpha1.IsConnectionNameAvailableRequest - (*IsConnectionNameAvailableResponse)(nil), // 29: mgmt.v1alpha1.IsConnectionNameAvailableResponse - (*CheckSqlQueryRequest)(nil), // 30: mgmt.v1alpha1.CheckSqlQueryRequest - (*CheckSqlQueryResponse)(nil), // 31: mgmt.v1alpha1.CheckSqlQueryResponse - (*timestamppb.Timestamp)(nil), // 32: google.protobuf.Timestamp + (*ClientTlsConfig)(nil), // 18: mgmt.v1alpha1.ClientTlsConfig + (*SqlConnectionOptions)(nil), // 19: mgmt.v1alpha1.SqlConnectionOptions + (*SSHTunnel)(nil), // 20: mgmt.v1alpha1.SSHTunnel + (*SSHAuthentication)(nil), // 21: mgmt.v1alpha1.SSHAuthentication + (*SSHPassphrase)(nil), // 22: mgmt.v1alpha1.SSHPassphrase + (*SSHPrivateKey)(nil), // 23: mgmt.v1alpha1.SSHPrivateKey + (*PostgresConnection)(nil), // 24: mgmt.v1alpha1.PostgresConnection + (*MysqlConnection)(nil), // 25: mgmt.v1alpha1.MysqlConnection + (*MysqlConnectionConfig)(nil), // 26: mgmt.v1alpha1.MysqlConnectionConfig + (*AwsS3ConnectionConfig)(nil), // 27: mgmt.v1alpha1.AwsS3ConnectionConfig + (*AwsS3Credentials)(nil), // 28: mgmt.v1alpha1.AwsS3Credentials + (*IsConnectionNameAvailableRequest)(nil), // 29: mgmt.v1alpha1.IsConnectionNameAvailableRequest + (*IsConnectionNameAvailableResponse)(nil), // 30: mgmt.v1alpha1.IsConnectionNameAvailableResponse + (*CheckSqlQueryRequest)(nil), // 31: mgmt.v1alpha1.CheckSqlQueryRequest + (*CheckSqlQueryResponse)(nil), // 32: mgmt.v1alpha1.CheckSqlQueryResponse + (*timestamppb.Timestamp)(nil), // 33: google.protobuf.Timestamp } var file_mgmt_v1alpha1_connection_proto_depIdxs = []int32{ 13, // 0: mgmt.v1alpha1.GetConnectionsResponse.connections:type_name -> mgmt.v1alpha1.Connection @@ -2588,44 +2681,45 @@ var file_mgmt_v1alpha1_connection_proto_depIdxs = []int32{ 14, // 6: mgmt.v1alpha1.CheckConnectionConfigRequest.connection_config:type_name -> mgmt.v1alpha1.ConnectionConfig 12, // 7: mgmt.v1alpha1.CheckConnectionConfigResponse.privileges:type_name -> mgmt.v1alpha1.ConnectionRolePrivilege 14, // 8: mgmt.v1alpha1.Connection.connection_config:type_name -> mgmt.v1alpha1.ConnectionConfig - 32, // 9: mgmt.v1alpha1.Connection.created_at:type_name -> google.protobuf.Timestamp - 32, // 10: mgmt.v1alpha1.Connection.updated_at:type_name -> google.protobuf.Timestamp + 33, // 9: mgmt.v1alpha1.Connection.created_at:type_name -> google.protobuf.Timestamp + 33, // 10: mgmt.v1alpha1.Connection.updated_at:type_name -> google.protobuf.Timestamp 17, // 11: mgmt.v1alpha1.ConnectionConfig.pg_config:type_name -> mgmt.v1alpha1.PostgresConnectionConfig - 26, // 12: mgmt.v1alpha1.ConnectionConfig.aws_s3_config:type_name -> mgmt.v1alpha1.AwsS3ConnectionConfig - 25, // 13: mgmt.v1alpha1.ConnectionConfig.mysql_config:type_name -> mgmt.v1alpha1.MysqlConnectionConfig + 27, // 12: mgmt.v1alpha1.ConnectionConfig.aws_s3_config:type_name -> mgmt.v1alpha1.AwsS3ConnectionConfig + 26, // 13: mgmt.v1alpha1.ConnectionConfig.mysql_config:type_name -> mgmt.v1alpha1.MysqlConnectionConfig 16, // 14: mgmt.v1alpha1.ConnectionConfig.local_dir_config:type_name -> mgmt.v1alpha1.LocalDirectoryConnectionConfig 15, // 15: mgmt.v1alpha1.ConnectionConfig.openai_config:type_name -> mgmt.v1alpha1.OpenAiConnectionConfig - 23, // 16: mgmt.v1alpha1.PostgresConnectionConfig.connection:type_name -> mgmt.v1alpha1.PostgresConnection - 19, // 17: mgmt.v1alpha1.PostgresConnectionConfig.tunnel:type_name -> mgmt.v1alpha1.SSHTunnel - 18, // 18: mgmt.v1alpha1.PostgresConnectionConfig.connection_options:type_name -> mgmt.v1alpha1.SqlConnectionOptions - 20, // 19: mgmt.v1alpha1.SSHTunnel.authentication:type_name -> mgmt.v1alpha1.SSHAuthentication - 21, // 20: mgmt.v1alpha1.SSHAuthentication.passphrase:type_name -> mgmt.v1alpha1.SSHPassphrase - 22, // 21: mgmt.v1alpha1.SSHAuthentication.private_key:type_name -> mgmt.v1alpha1.SSHPrivateKey - 24, // 22: mgmt.v1alpha1.MysqlConnectionConfig.connection:type_name -> mgmt.v1alpha1.MysqlConnection - 19, // 23: mgmt.v1alpha1.MysqlConnectionConfig.tunnel:type_name -> mgmt.v1alpha1.SSHTunnel - 18, // 24: mgmt.v1alpha1.MysqlConnectionConfig.connection_options:type_name -> mgmt.v1alpha1.SqlConnectionOptions - 27, // 25: mgmt.v1alpha1.AwsS3ConnectionConfig.credentials:type_name -> mgmt.v1alpha1.AwsS3Credentials - 0, // 26: mgmt.v1alpha1.ConnectionService.GetConnections:input_type -> mgmt.v1alpha1.GetConnectionsRequest - 2, // 27: mgmt.v1alpha1.ConnectionService.GetConnection:input_type -> mgmt.v1alpha1.GetConnectionRequest - 4, // 28: mgmt.v1alpha1.ConnectionService.CreateConnection:input_type -> mgmt.v1alpha1.CreateConnectionRequest - 6, // 29: mgmt.v1alpha1.ConnectionService.UpdateConnection:input_type -> mgmt.v1alpha1.UpdateConnectionRequest - 8, // 30: mgmt.v1alpha1.ConnectionService.DeleteConnection:input_type -> mgmt.v1alpha1.DeleteConnectionRequest - 28, // 31: mgmt.v1alpha1.ConnectionService.IsConnectionNameAvailable:input_type -> mgmt.v1alpha1.IsConnectionNameAvailableRequest - 10, // 32: mgmt.v1alpha1.ConnectionService.CheckConnectionConfig:input_type -> mgmt.v1alpha1.CheckConnectionConfigRequest - 30, // 33: mgmt.v1alpha1.ConnectionService.CheckSqlQuery:input_type -> mgmt.v1alpha1.CheckSqlQueryRequest - 1, // 34: mgmt.v1alpha1.ConnectionService.GetConnections:output_type -> mgmt.v1alpha1.GetConnectionsResponse - 3, // 35: mgmt.v1alpha1.ConnectionService.GetConnection:output_type -> mgmt.v1alpha1.GetConnectionResponse - 5, // 36: mgmt.v1alpha1.ConnectionService.CreateConnection:output_type -> mgmt.v1alpha1.CreateConnectionResponse - 7, // 37: mgmt.v1alpha1.ConnectionService.UpdateConnection:output_type -> mgmt.v1alpha1.UpdateConnectionResponse - 9, // 38: mgmt.v1alpha1.ConnectionService.DeleteConnection:output_type -> mgmt.v1alpha1.DeleteConnectionResponse - 29, // 39: mgmt.v1alpha1.ConnectionService.IsConnectionNameAvailable:output_type -> mgmt.v1alpha1.IsConnectionNameAvailableResponse - 11, // 40: mgmt.v1alpha1.ConnectionService.CheckConnectionConfig:output_type -> mgmt.v1alpha1.CheckConnectionConfigResponse - 31, // 41: mgmt.v1alpha1.ConnectionService.CheckSqlQuery:output_type -> mgmt.v1alpha1.CheckSqlQueryResponse - 34, // [34:42] is the sub-list for method output_type - 26, // [26:34] 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 + 24, // 16: mgmt.v1alpha1.PostgresConnectionConfig.connection:type_name -> mgmt.v1alpha1.PostgresConnection + 20, // 17: mgmt.v1alpha1.PostgresConnectionConfig.tunnel:type_name -> mgmt.v1alpha1.SSHTunnel + 19, // 18: mgmt.v1alpha1.PostgresConnectionConfig.connection_options:type_name -> mgmt.v1alpha1.SqlConnectionOptions + 18, // 19: mgmt.v1alpha1.PostgresConnectionConfig.client_tls:type_name -> mgmt.v1alpha1.ClientTlsConfig + 21, // 20: mgmt.v1alpha1.SSHTunnel.authentication:type_name -> mgmt.v1alpha1.SSHAuthentication + 22, // 21: mgmt.v1alpha1.SSHAuthentication.passphrase:type_name -> mgmt.v1alpha1.SSHPassphrase + 23, // 22: mgmt.v1alpha1.SSHAuthentication.private_key:type_name -> mgmt.v1alpha1.SSHPrivateKey + 25, // 23: mgmt.v1alpha1.MysqlConnectionConfig.connection:type_name -> mgmt.v1alpha1.MysqlConnection + 20, // 24: mgmt.v1alpha1.MysqlConnectionConfig.tunnel:type_name -> mgmt.v1alpha1.SSHTunnel + 19, // 25: mgmt.v1alpha1.MysqlConnectionConfig.connection_options:type_name -> mgmt.v1alpha1.SqlConnectionOptions + 28, // 26: mgmt.v1alpha1.AwsS3ConnectionConfig.credentials:type_name -> mgmt.v1alpha1.AwsS3Credentials + 0, // 27: mgmt.v1alpha1.ConnectionService.GetConnections:input_type -> mgmt.v1alpha1.GetConnectionsRequest + 2, // 28: mgmt.v1alpha1.ConnectionService.GetConnection:input_type -> mgmt.v1alpha1.GetConnectionRequest + 4, // 29: mgmt.v1alpha1.ConnectionService.CreateConnection:input_type -> mgmt.v1alpha1.CreateConnectionRequest + 6, // 30: mgmt.v1alpha1.ConnectionService.UpdateConnection:input_type -> mgmt.v1alpha1.UpdateConnectionRequest + 8, // 31: mgmt.v1alpha1.ConnectionService.DeleteConnection:input_type -> mgmt.v1alpha1.DeleteConnectionRequest + 29, // 32: mgmt.v1alpha1.ConnectionService.IsConnectionNameAvailable:input_type -> mgmt.v1alpha1.IsConnectionNameAvailableRequest + 10, // 33: mgmt.v1alpha1.ConnectionService.CheckConnectionConfig:input_type -> mgmt.v1alpha1.CheckConnectionConfigRequest + 31, // 34: mgmt.v1alpha1.ConnectionService.CheckSqlQuery:input_type -> mgmt.v1alpha1.CheckSqlQueryRequest + 1, // 35: mgmt.v1alpha1.ConnectionService.GetConnections:output_type -> mgmt.v1alpha1.GetConnectionsResponse + 3, // 36: mgmt.v1alpha1.ConnectionService.GetConnection:output_type -> mgmt.v1alpha1.GetConnectionResponse + 5, // 37: mgmt.v1alpha1.ConnectionService.CreateConnection:output_type -> mgmt.v1alpha1.CreateConnectionResponse + 7, // 38: mgmt.v1alpha1.ConnectionService.UpdateConnection:output_type -> mgmt.v1alpha1.UpdateConnectionResponse + 9, // 39: mgmt.v1alpha1.ConnectionService.DeleteConnection:output_type -> mgmt.v1alpha1.DeleteConnectionResponse + 30, // 40: mgmt.v1alpha1.ConnectionService.IsConnectionNameAvailable:output_type -> mgmt.v1alpha1.IsConnectionNameAvailableResponse + 11, // 41: mgmt.v1alpha1.ConnectionService.CheckConnectionConfig:output_type -> mgmt.v1alpha1.CheckConnectionConfigResponse + 32, // 42: mgmt.v1alpha1.ConnectionService.CheckSqlQuery:output_type -> mgmt.v1alpha1.CheckSqlQueryResponse + 35, // [35:43] is the sub-list for method output_type + 27, // [27:35] is the sub-list for method input_type + 27, // [27:27] is the sub-list for extension type_name + 27, // [27:27] is the sub-list for extension extendee + 0, // [0:27] is the sub-list for field type_name } func init() { file_mgmt_v1alpha1_connection_proto_init() } @@ -2851,7 +2945,7 @@ func file_mgmt_v1alpha1_connection_proto_init() { } } file_mgmt_v1alpha1_connection_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SqlConnectionOptions); i { + switch v := v.(*ClientTlsConfig); i { case 0: return &v.state case 1: @@ -2863,7 +2957,7 @@ func file_mgmt_v1alpha1_connection_proto_init() { } } file_mgmt_v1alpha1_connection_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SSHTunnel); i { + switch v := v.(*SqlConnectionOptions); i { case 0: return &v.state case 1: @@ -2875,7 +2969,7 @@ func file_mgmt_v1alpha1_connection_proto_init() { } } file_mgmt_v1alpha1_connection_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SSHAuthentication); i { + switch v := v.(*SSHTunnel); i { case 0: return &v.state case 1: @@ -2887,7 +2981,7 @@ func file_mgmt_v1alpha1_connection_proto_init() { } } file_mgmt_v1alpha1_connection_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SSHPassphrase); i { + switch v := v.(*SSHAuthentication); i { case 0: return &v.state case 1: @@ -2899,7 +2993,7 @@ func file_mgmt_v1alpha1_connection_proto_init() { } } file_mgmt_v1alpha1_connection_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SSHPrivateKey); i { + switch v := v.(*SSHPassphrase); i { case 0: return &v.state case 1: @@ -2911,7 +3005,7 @@ func file_mgmt_v1alpha1_connection_proto_init() { } } file_mgmt_v1alpha1_connection_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostgresConnection); i { + switch v := v.(*SSHPrivateKey); i { case 0: return &v.state case 1: @@ -2923,7 +3017,7 @@ func file_mgmt_v1alpha1_connection_proto_init() { } } file_mgmt_v1alpha1_connection_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MysqlConnection); i { + switch v := v.(*PostgresConnection); i { case 0: return &v.state case 1: @@ -2935,7 +3029,7 @@ func file_mgmt_v1alpha1_connection_proto_init() { } } file_mgmt_v1alpha1_connection_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MysqlConnectionConfig); i { + switch v := v.(*MysqlConnection); i { case 0: return &v.state case 1: @@ -2947,7 +3041,7 @@ func file_mgmt_v1alpha1_connection_proto_init() { } } file_mgmt_v1alpha1_connection_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AwsS3ConnectionConfig); i { + switch v := v.(*MysqlConnectionConfig); i { case 0: return &v.state case 1: @@ -2959,7 +3053,7 @@ func file_mgmt_v1alpha1_connection_proto_init() { } } file_mgmt_v1alpha1_connection_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AwsS3Credentials); i { + switch v := v.(*AwsS3ConnectionConfig); i { case 0: return &v.state case 1: @@ -2971,7 +3065,7 @@ func file_mgmt_v1alpha1_connection_proto_init() { } } file_mgmt_v1alpha1_connection_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IsConnectionNameAvailableRequest); i { + switch v := v.(*AwsS3Credentials); i { case 0: return &v.state case 1: @@ -2983,7 +3077,7 @@ func file_mgmt_v1alpha1_connection_proto_init() { } } file_mgmt_v1alpha1_connection_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IsConnectionNameAvailableResponse); i { + switch v := v.(*IsConnectionNameAvailableRequest); i { case 0: return &v.state case 1: @@ -2995,7 +3089,7 @@ func file_mgmt_v1alpha1_connection_proto_init() { } } file_mgmt_v1alpha1_connection_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CheckSqlQueryRequest); i { + switch v := v.(*IsConnectionNameAvailableResponse); i { case 0: return &v.state case 1: @@ -3007,6 +3101,18 @@ func file_mgmt_v1alpha1_connection_proto_init() { } } file_mgmt_v1alpha1_connection_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CheckSqlQueryRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mgmt_v1alpha1_connection_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CheckSqlQueryResponse); i { case 0: return &v.state @@ -3033,26 +3139,27 @@ func file_mgmt_v1alpha1_connection_proto_init() { } file_mgmt_v1alpha1_connection_proto_msgTypes[18].OneofWrappers = []interface{}{} file_mgmt_v1alpha1_connection_proto_msgTypes[19].OneofWrappers = []interface{}{} - file_mgmt_v1alpha1_connection_proto_msgTypes[20].OneofWrappers = []interface{}{ + file_mgmt_v1alpha1_connection_proto_msgTypes[20].OneofWrappers = []interface{}{} + file_mgmt_v1alpha1_connection_proto_msgTypes[21].OneofWrappers = []interface{}{ (*SSHAuthentication_Passphrase)(nil), (*SSHAuthentication_PrivateKey)(nil), } - file_mgmt_v1alpha1_connection_proto_msgTypes[22].OneofWrappers = []interface{}{} file_mgmt_v1alpha1_connection_proto_msgTypes[23].OneofWrappers = []interface{}{} - file_mgmt_v1alpha1_connection_proto_msgTypes[25].OneofWrappers = []interface{}{ + file_mgmt_v1alpha1_connection_proto_msgTypes[24].OneofWrappers = []interface{}{} + file_mgmt_v1alpha1_connection_proto_msgTypes[26].OneofWrappers = []interface{}{ (*MysqlConnectionConfig_Url)(nil), (*MysqlConnectionConfig_Connection)(nil), } - file_mgmt_v1alpha1_connection_proto_msgTypes[26].OneofWrappers = []interface{}{} file_mgmt_v1alpha1_connection_proto_msgTypes[27].OneofWrappers = []interface{}{} - file_mgmt_v1alpha1_connection_proto_msgTypes[31].OneofWrappers = []interface{}{} + file_mgmt_v1alpha1_connection_proto_msgTypes[28].OneofWrappers = []interface{}{} + file_mgmt_v1alpha1_connection_proto_msgTypes[32].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_mgmt_v1alpha1_connection_proto_rawDesc, NumEnums: 0, - NumMessages: 32, + NumMessages: 33, NumExtensions: 0, NumServices: 1, }, diff --git a/backend/gen/go/protos/mgmt/v1alpha1/connection.pb.validate.go b/backend/gen/go/protos/mgmt/v1alpha1/connection.pb.validate.go index 77ac88bb40..ccfbe3000d 100644 --- a/backend/gen/go/protos/mgmt/v1alpha1/connection.pb.validate.go +++ b/backend/gen/go/protos/mgmt/v1alpha1/connection.pb.validate.go @@ -2428,6 +2428,35 @@ func (m *PostgresConnectionConfig) validate(all bool) error { } } + if all { + switch v := interface{}(m.GetClientTls()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, PostgresConnectionConfigValidationError{ + field: "ClientTls", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, PostgresConnectionConfigValidationError{ + field: "ClientTls", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetClientTls()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return PostgresConnectionConfigValidationError{ + field: "ClientTls", + reason: "embedded message failed validation", + cause: err, + } + } + } + switch v := m.ConnectionConfig.(type) { case *PostgresConnectionConfig_Url: if v == nil { @@ -2566,6 +2595,118 @@ var _ interface { ErrorName() string } = PostgresConnectionConfigValidationError{} +// Validate checks the field values on ClientTlsConfig with the rules defined +// in the proto definition for this message. If any rules are violated, the +// first error encountered is returned, or nil if there are no violations. +func (m *ClientTlsConfig) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on ClientTlsConfig with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// ClientTlsConfigMultiError, or nil if none found. +func (m *ClientTlsConfig) ValidateAll() error { + return m.validate(true) +} + +func (m *ClientTlsConfig) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if m.RootCert != nil { + // no validation rules for RootCert + } + + if m.ClientCert != nil { + // no validation rules for ClientCert + } + + if m.ClientKey != nil { + // no validation rules for ClientKey + } + + if len(errors) > 0 { + return ClientTlsConfigMultiError(errors) + } + + return nil +} + +// ClientTlsConfigMultiError is an error wrapping multiple validation errors +// returned by ClientTlsConfig.ValidateAll() if the designated constraints +// aren't met. +type ClientTlsConfigMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m ClientTlsConfigMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m ClientTlsConfigMultiError) AllErrors() []error { return m } + +// ClientTlsConfigValidationError is the validation error returned by +// ClientTlsConfig.Validate if the designated constraints aren't met. +type ClientTlsConfigValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ClientTlsConfigValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ClientTlsConfigValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ClientTlsConfigValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ClientTlsConfigValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ClientTlsConfigValidationError) ErrorName() string { return "ClientTlsConfigValidationError" } + +// Error satisfies the builtin error interface +func (e ClientTlsConfigValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sClientTlsConfig.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ClientTlsConfigValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ClientTlsConfigValidationError{} + // Validate checks the field values on SqlConnectionOptions with the rules // defined in the proto definition for this message. If any rules are // violated, the first error encountered is returned, or nil if there are no violations. diff --git a/backend/pkg/sqlconnect/pgpool.go b/backend/pkg/sqlconnect/pgpool.go index b9707b9834..d1b246c5a7 100644 --- a/backend/pkg/sqlconnect/pgpool.go +++ b/backend/pkg/sqlconnect/pgpool.go @@ -2,6 +2,7 @@ package sqlconnect import ( context "context" + "fmt" "log/slog" "github.com/jackc/pgx/v5/pgxpool" @@ -46,6 +47,7 @@ func (s *PgPool) Open(ctx context.Context) (pg_queries.DBTX, error) { return nil, err } <-ready + _, localport := s.details.Tunnel.GetLocalHostPort() newPort := int32(localport) s.details.GeneralDbConnectConfig.Port = newPort @@ -53,7 +55,7 @@ func (s *PgPool) Open(ctx context.Context) (pg_queries.DBTX, error) { config, err := pgxpool.ParseConfig(dsn) if err != nil { - return nil, err + return nil, fmt.Errorf("unable to parse dsn into pg config: %w", err) } // set max number of connections. diff --git a/backend/pkg/sqlconnect/sql-connector.go b/backend/pkg/sqlconnect/sql-connector.go index d9c6f3689f..a72d6e80f2 100644 --- a/backend/pkg/sqlconnect/sql-connector.go +++ b/backend/pkg/sqlconnect/sql-connector.go @@ -2,11 +2,15 @@ package sqlconnect import ( "context" + "crypto/sha256" "database/sql" + "encoding/hex" "errors" "fmt" "log/slog" "net/url" + "os" + "path/filepath" "strconv" "strings" @@ -15,6 +19,7 @@ import ( nucleuserrors "github.com/nucleuscloud/neosync/backend/internal/errors" "github.com/nucleuscloud/neosync/backend/pkg/sshtunnel" "golang.org/x/crypto/ssh" + "golang.org/x/sync/errgroup" ) type SqlDBTX interface { @@ -37,7 +42,7 @@ func (rc *SqlOpenConnector) NewDbFromConnectionConfig(connectionConfig *mgmtv1al return nil, errors.New("connectionConfig was nil, expected *mgmtv1alpha1.ConnectionConfig") } - details, err := GetConnectionDetails(connectionConfig, connectionTimeout, logger) + details, err := GetConnectionDetails(connectionConfig, connectionTimeout, UpsertCLientTlsFiles, logger) if err != nil { return nil, err } @@ -53,7 +58,7 @@ func (rc *SqlOpenConnector) NewPgPoolFromConnectionConfig(pgconfig *mgmtv1alpha1 Config: &mgmtv1alpha1.ConnectionConfig_PgConfig{ PgConfig: pgconfig, }, - }, connectionTimeout, logger) + }, connectionTimeout, UpsertCLientTlsFiles, logger) if err != nil { return nil, err } @@ -67,6 +72,13 @@ type ConnectionDetails struct { Tunnel *sshtunnel.Sshtunnel } +type ClientCertConfig struct { + RootCert *string + + ClientCert *string + ClientKey *string +} + const ( mysqlDriver = "mysql" postgresDriver = "postgres" @@ -74,9 +86,108 @@ const ( randomPort = 0 ) +type ClientTlsFileConfig struct { + RootCert *string + + ClientCert *string + ClientKey *string +} + +func UpsertCLientTlsFiles(config *mgmtv1alpha1.ClientTlsConfig) (*ClientTlsFileConfig, error) { + if config == nil { + return nil, errors.New("config was nil") + } + + errgrp := errgroup.Group{} + + filenames := getClientTlsFileNames(config) + + errgrp.Go(func() error { + if filenames.RootCert == nil { + return nil + } + _, err := os.Stat(*filenames.RootCert) + if err != nil && !os.IsNotExist(err) { + return err + } else if err != nil && os.IsNotExist(err) { + if err := os.WriteFile(*filenames.RootCert, []byte(config.GetRootCert()), 0600); err != nil { + return err + } + } + return nil + }) + errgrp.Go(func() error { + if filenames.ClientCert != nil && filenames.ClientKey != nil { + _, err := os.Stat(*filenames.ClientKey) + if err != nil && !os.IsNotExist(err) { + return err + } else if err != nil && os.IsNotExist(err) { + if err := os.WriteFile(*filenames.ClientKey, []byte(config.GetClientKey()), 0600); err != nil { + return err + } + } + } + return nil + }) + errgrp.Go(func() error { + if filenames.ClientCert != nil && filenames.ClientKey != nil { + _, err := os.Stat(*filenames.ClientCert) + if err != nil && !os.IsNotExist(err) { + return err + } else if err != nil && os.IsNotExist(err) { + if err := os.WriteFile(*filenames.ClientCert, []byte(config.GetClientCert()), 0600); err != nil { + return err + } + } + } + return nil + }) + + err := errgrp.Wait() + if err != nil { + return nil, err + } + + return &filenames, nil +} + +func getClientTlsFileNames(config *mgmtv1alpha1.ClientTlsConfig) ClientTlsFileConfig { + if config == nil { + return ClientTlsFileConfig{} + } + + basedir := os.TempDir() + + output := ClientTlsFileConfig{} + if config.GetRootCert() != "" { + content := hashContent(config.GetRootCert()) + fullpath := filepath.Join(basedir, content) + output.RootCert = &fullpath + } + if config.GetClientCert() != "" && config.GetClientKey() != "" { + certContent := hashContent(config.GetClientCert()) + certpath := filepath.Join(basedir, certContent) + keyContent := hashContent(config.GetClientKey()) + keypath := filepath.Join(basedir, keyContent) + output.ClientCert = &certpath + output.ClientKey = &keypath + } + return output +} + +func hashContent(content string) string { + hash := sha256.Sum256([]byte(content)) + return hex.EncodeToString(hash[:]) +} + // Method for retrieving connection details, including tunneling information. // Only use if requiring direct access to the SSH Tunnel, otherwise the SqlConnector should be used instead. -func GetConnectionDetails(c *mgmtv1alpha1.ConnectionConfig, connectionTimeout *uint32, logger *slog.Logger) (*ConnectionDetails, error) { +func GetConnectionDetails( + c *mgmtv1alpha1.ConnectionConfig, + connectionTimeout *uint32, + handleClientTlsConfig func(config *mgmtv1alpha1.ClientTlsConfig) (*ClientTlsFileConfig, error), + logger *slog.Logger, +) (*ConnectionDetails, error) { if c == nil { return nil, errors.New("connection config was nil, expected *mgmtv1alpha1.ConnectionConfig") } @@ -124,6 +235,13 @@ func GetConnectionDetails(c *mgmtv1alpha1.ConnectionConfig, connectionTimeout *u }, nil } + if config.PgConfig.GetClientTls() != nil { + _, err := handleClientTlsConfig(config.PgConfig.GetClientTls()) + if err != nil { + return nil, err + } + } + connDetails, err := getGeneralDbConnectConfigFromPg(config, connectionTimeout) if err != nil { return nil, err @@ -325,6 +443,16 @@ func getGeneralDbConnectConfigFromPg(config *mgmtv1alpha1.ConnectionConfig_PgCon if connectionTimeout != nil { query.Add("connect_timeout", fmt.Sprintf("%d", *connectionTimeout)) } + if config.PgConfig.GetClientTls() != nil { + filenames := getClientTlsFileNames(config.PgConfig.GetClientTls()) + if filenames.RootCert != nil { + query.Add("sslrootcert", *filenames.RootCert) + } + if filenames.ClientCert != nil && filenames.ClientKey != nil { + query.Add("sslcert", *filenames.ClientCert) + query.Add("sslkey", *filenames.ClientKey) + } + } return &GeneralDbConnectConfig{ Driver: postgresDriver, Host: cc.Connection.Host, @@ -362,6 +490,17 @@ func getGeneralDbConnectConfigFromPg(config *mgmtv1alpha1.ConnectionConfig_PgCon // default to standard postgres port 5432 if port not provided port = int64(5432) } + query := u.Query() + if config.PgConfig.GetClientTls() != nil { + filenames := getClientTlsFileNames(config.PgConfig.GetClientTls()) + if filenames.RootCert != nil { + query.Add("sslrootcert", *filenames.RootCert) + } + if filenames.ClientCert != nil && filenames.ClientKey != nil { + query.Add("sslcert", *filenames.ClientCert) + query.Add("sslkey", *filenames.ClientKey) + } + } return &GeneralDbConnectConfig{ Driver: postgresDriver, @@ -370,7 +509,7 @@ func getGeneralDbConnectConfigFromPg(config *mgmtv1alpha1.ConnectionConfig_PgCon Database: strings.TrimPrefix(u.Path, "/"), User: user, Pass: pass, - QueryParams: u.Query(), + QueryParams: query, }, nil default: return nil, nucleuserrors.NewBadRequest("must provide valid postgres connection") diff --git a/backend/pkg/sqlconnect/sql-connector_test.go b/backend/pkg/sqlconnect/sql-connector_test.go index cc579e794c..4cec28ed73 100644 --- a/backend/pkg/sqlconnect/sql-connector_test.go +++ b/backend/pkg/sqlconnect/sql-connector_test.go @@ -251,6 +251,7 @@ func Test_getConnectionDetails_Pg_NoTunnel(t *testing.T) { }, }, ptr(uint32(5)), + nil, slog.Default(), ) assert.NoError(t, err) @@ -278,6 +279,7 @@ func Test_getConnectionDetails_Pg_Tunnel(t *testing.T) { }, }, ptr(uint32(5)), + nil, slog.Default(), ) assert.NoError(t, err) @@ -300,6 +302,7 @@ func Test_getConnectionDetails_Mysql_NoTunnel(t *testing.T) { }, }, ptr(uint32(5)), + nil, slog.Default(), ) assert.NoError(t, err) @@ -327,6 +330,7 @@ func Test_getConnectionDetails_Mysql_Tunnel(t *testing.T) { }, }, ptr(uint32(5)), + nil, slog.Default(), ) assert.NoError(t, err) diff --git a/backend/pkg/sqlconnect/sqldb.go b/backend/pkg/sqlconnect/sqldb.go index af483f4c0c..1e6e40180b 100644 --- a/backend/pkg/sqlconnect/sqldb.go +++ b/backend/pkg/sqlconnect/sqldb.go @@ -41,6 +41,7 @@ func (s *SqlDb) Open() (SqlDBTX, error) { newPort := int32(localport) s.details.GeneralDbConnectConfig.Port = newPort dsn := s.details.GeneralDbConnectConfig.String() + db, err := sql.Open(s.details.GeneralDbConnectConfig.Driver, dsn) if err != nil { s.details.Tunnel.Close() diff --git a/backend/protos/mgmt/v1alpha1/connection.proto b/backend/protos/mgmt/v1alpha1/connection.proto index 89fc535e82..ec3fb9bc51 100644 --- a/backend/protos/mgmt/v1alpha1/connection.proto +++ b/backend/protos/mgmt/v1alpha1/connection.proto @@ -122,9 +122,23 @@ message PostgresConnectionConfig { // Provide tunnel configuration that can be used to access a postgres connection that is not publicly accessible to the internet SSHTunnel tunnel = 3; SqlConnectionOptions connection_options = 4; + // Provide client-side TLS Certificates + ClientTlsConfig client_tls = 5; +} + +// Config for providing client-side TLS certificates +message ClientTlsConfig { + // Root Certificate in PEM Format + optional string root_cert = 1; + + // Client Certificate in PEM format. Must also provide key. + optional string client_cert = 2; + // Client Key in PEM format. Must also provide cert. + optional string client_key = 3; } message SqlConnectionOptions { + // Limits the number of open connections in the pool. optional int32 max_connection_limit = 1; } diff --git a/backend/sql/postgresql/models/models.go b/backend/sql/postgresql/models/models.go index a7832f42b7..529b764252 100644 --- a/backend/sql/postgresql/models/models.go +++ b/backend/sql/postgresql/models/models.go @@ -25,6 +25,10 @@ func (c *ConnectionConfig) ToDto() *mgmtv1alpha1.ConnectionConfig { if c.PgConfig.ConnectionOptions != nil { connectionOptions = c.PgConfig.ConnectionOptions.ToDto() } + var clientTls *mgmtv1alpha1.ClientTlsConfig + if c.PgConfig.ClientTls != nil { + clientTls = c.PgConfig.ClientTls.ToDto() + } if c.PgConfig.Connection != nil { return &mgmtv1alpha1.ConnectionConfig{ Config: &mgmtv1alpha1.ConnectionConfig_PgConfig{ @@ -41,6 +45,7 @@ func (c *ConnectionConfig) ToDto() *mgmtv1alpha1.ConnectionConfig { }, Tunnel: tunnel, ConnectionOptions: connectionOptions, + ClientTls: clientTls, }, }, } @@ -53,6 +58,7 @@ func (c *ConnectionConfig) ToDto() *mgmtv1alpha1.ConnectionConfig { }, Tunnel: tunnel, ConnectionOptions: connectionOptions, + ClientTls: clientTls, }, }, } @@ -131,6 +137,13 @@ func (c *ConnectionConfig) FromDto(dto *mgmtv1alpha1.ConnectionConfig) error { c.PgConfig.ConnectionOptions = &ConnectionOptions{} c.PgConfig.ConnectionOptions.FromDto(config.PgConfig.ConnectionOptions) } + if config.PgConfig.GetClientTls() != nil { + c.PgConfig.ClientTls = &ClientTls{ + RootCert: config.PgConfig.GetClientTls().RootCert, + ClientCert: config.PgConfig.GetClientTls().ClientCert, + ClientKey: config.PgConfig.GetClientTls().ClientKey, + } + } switch pgcfg := config.PgConfig.ConnectionConfig.(type) { case *mgmtv1alpha1.PostgresConnectionConfig_Connection: c.PgConfig.Connection = &PostgresConnection{ @@ -194,6 +207,7 @@ type PostgresConnectionConfig struct { Url *string `json:"url,omitempty"` SSHTunnel *SSHTunnel `json:"sshTunnel,omitempty"` ConnectionOptions *ConnectionOptions `json:"connectionOptions,omitempty"` + ClientTls *ClientTls `json:"clientTls,omitempty"` } type PostgresConnection struct { @@ -303,6 +317,29 @@ type SSHPrivateKey struct { Passphrase *string `json:"passphrase,omitempty"` } +type ClientTls struct { + RootCert *string `json:"rootCert,omitempty"` + ClientCert *string `json:"clientCert,omitempty"` + ClientKey *string `json:"clientKey,omitempty"` +} + +func (c *ClientTls) ToDto() *mgmtv1alpha1.ClientTlsConfig { + return &mgmtv1alpha1.ClientTlsConfig{ + RootCert: c.RootCert, + ClientCert: c.ClientCert, + ClientKey: c.ClientKey, + } +} + +func (c *ClientTls) FromDto(dto *mgmtv1alpha1.ClientTlsConfig) { + if dto == nil { + dto = &mgmtv1alpha1.ClientTlsConfig{} + } + c.RootCert = dto.RootCert + c.ClientCert = dto.ClientCert + c.ClientKey = dto.ClientKey +} + type MysqlConnectionConfig struct { Connection *MysqlConnection `json:"connection,omitempty"` Url *string `json:"url,omitempty"` diff --git a/docs/protos/data/proto_docs.json b/docs/protos/data/proto_docs.json index 1aa0da7844..ae009793a1 100644 --- a/docs/protos/data/proto_docs.json +++ b/docs/protos/data/proto_docs.json @@ -1279,6 +1279,54 @@ } ] }, + { + "name": "ClientTlsConfig", + "longName": "ClientTlsConfig", + "fullName": "mgmt.v1alpha1.ClientTlsConfig", + "description": "Config for providing client-side TLS certificates", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": true, + "extensions": [], + "fields": [ + { + "name": "root_cert", + "description": "Root Certificate in PEM Format", + "label": "optional", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": true, + "oneofdecl": "_root_cert", + "defaultValue": "" + }, + { + "name": "client_cert", + "description": "Client Certificate in PEM format. Must also provide key.", + "label": "optional", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": true, + "oneofdecl": "_client_cert", + "defaultValue": "" + }, + { + "name": "client_key", + "description": "Client Key in PEM format. Must also provide cert.", + "label": "optional", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": true, + "oneofdecl": "_client_key", + "defaultValue": "" + } + ] + }, { "name": "Connection", "longName": "Connection", @@ -2127,6 +2175,18 @@ "isoneof": false, "oneofdecl": "", "defaultValue": "" + }, + { + "name": "client_tls", + "description": "Provide client-side TLS Certificates", + "label": "", + "type": "ClientTlsConfig", + "longType": "ClientTlsConfig", + "fullType": "mgmt.v1alpha1.ClientTlsConfig", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" } ] }, @@ -2310,7 +2370,7 @@ "fields": [ { "name": "max_connection_limit", - "description": "", + "description": "Limits the number of open connections in the pool.", "label": "optional", "type": "int32", "longType": "int32", diff --git a/frontend/apps/web/app/(mgmt)/[account]/connections/[id]/components/PostgresForm.tsx b/frontend/apps/web/app/(mgmt)/[account]/connections/[id]/components/PostgresForm.tsx index 83f50f0909..0048354241 100644 --- a/frontend/apps/web/app/(mgmt)/[account]/connections/[id]/components/PostgresForm.tsx +++ b/frontend/apps/web/app/(mgmt)/[account]/connections/[id]/components/PostgresForm.tsx @@ -41,6 +41,7 @@ import { import { yupResolver } from '@hookform/resolvers/yup'; import { CheckConnectionConfigResponse, + ClientTlsConfig, ConnectionConfig, PostgresConnection, PostgresConnectionConfig, @@ -63,7 +64,7 @@ interface Props { onSaveFailed(err: unknown): void; } -export default function PostgresForm(props: Props) { +export default function PostgresForm(props: Props): ReactElement { const { connectionId, defaultValues, onSaved, onSaveFailed } = props; const { account } = useAccount(); // used to know which tab - host or url that the user is on when we submit the form @@ -101,7 +102,8 @@ export default function PostgresForm(props: Props) { values.db, values.tunnel, undefined, - values.options + values.options, + values.clientTls ); } else if (activeTab === 'url') { connection = await updatePostgresConnection( @@ -111,7 +113,8 @@ export default function PostgresForm(props: Props) { undefined, undefined, values.url, - values.options + values.options, + values.clientTls ); } onSaved(connection); @@ -358,6 +361,72 @@ export default function PostgresForm(props: Props) { )} /> + + + Client TLS Certificates + +
+ Configuring this section allows Neosync to connect to the + database using SSL/TLS. The verification mode may be configured + using the SSL Field, or by specifying the option in the + postgresql url. +
+ ( + + Root Certificate + + {`The public key certificate of the CA that issued the + server's certificate. Root certificates are used to + authenticate the server to the client. They ensure that + the server the client is connecting to is trusted.`} + + +