From 8d9222bec35b85ac7cde6ae5b4a49a7a7a3f51a6 Mon Sep 17 00:00:00 2001 From: Todd Date: Wed, 28 Jun 2023 09:55:29 -0700 Subject: [PATCH] Add credential and libraries to session recording resource (#3374) --- ...vault_credential_library_attributes.gen.go | 4 +- ...icate_credential_library_attributes.gen.go | 4 +- .../ssh_private_key_attributes.gen.go | 4 +- .../username_password_attributes.gen.go | 4 +- api/sessionrecordings/credential.gen.go | 15 + .../credential_library.gen.go | 15 + api/sessionrecordings/credential_store.gen.go | 14 + .../json_credential_attributes.gen.go | 40 + ...h_private_key_credential_attributes.gen.go | 42 + ...name_password_credential_attributes.gen.go | 41 + api/sessionrecordings/values_at_time.gen.go | 8 +- ...vault_credential_library_attributes.gen.go | 42 + .../vault_credential_store_attributes.gen.go | 44 + ...icate_credential_library_attributes.gen.go | 46 + internal/api/genapi/input.go | 85 + internal/api/genapi/templates.go | 11 +- .../commands/sessionrecordingscmd/funcs.go | 143 ++ internal/gen/controller.swagger.json | 120 ++ .../v1/session_recording.proto | 162 ++ .../session_recording.pb.go | 1361 +++++++++++++++-- 20 files changed, 2055 insertions(+), 150 deletions(-) create mode 100644 api/sessionrecordings/credential.gen.go create mode 100644 api/sessionrecordings/credential_library.gen.go create mode 100644 api/sessionrecordings/credential_store.gen.go create mode 100644 api/sessionrecordings/json_credential_attributes.gen.go create mode 100644 api/sessionrecordings/ssh_private_key_credential_attributes.gen.go create mode 100644 api/sessionrecordings/username_password_credential_attributes.gen.go create mode 100644 api/sessionrecordings/vault_credential_library_attributes.gen.go create mode 100644 api/sessionrecordings/vault_credential_store_attributes.gen.go create mode 100644 api/sessionrecordings/vault_ssh_certificate_credential_library_attributes.gen.go diff --git a/api/credentiallibraries/vault_credential_library_attributes.gen.go b/api/credentiallibraries/vault_credential_library_attributes.gen.go index 916f3d596..1d6ae4a58 100644 --- a/api/credentiallibraries/vault_credential_library_attributes.gen.go +++ b/api/credentiallibraries/vault_credential_library_attributes.gen.go @@ -35,8 +35,8 @@ func AttributesMapToVaultCredentialLibraryAttributes(in map[string]interface{}) } func (pt *CredentialLibrary) GetVaultCredentialLibraryAttributes() (*VaultCredentialLibraryAttributes, error) { - if pt.Type != "vault" { - return nil, fmt.Errorf("asked to fetch %s-type attributes but credential-library is of type %s", "vault", pt.Type) + if pt.Type != "vault-generic" { + return nil, fmt.Errorf("asked to fetch %s-type attributes but credential-library is of type %s", "vault-generic", pt.Type) } return AttributesMapToVaultCredentialLibraryAttributes(pt.Attributes) } diff --git a/api/credentiallibraries/vault_ssh_certificate_credential_library_attributes.gen.go b/api/credentiallibraries/vault_ssh_certificate_credential_library_attributes.gen.go index 784d02597..6316ec158 100644 --- a/api/credentiallibraries/vault_ssh_certificate_credential_library_attributes.gen.go +++ b/api/credentiallibraries/vault_ssh_certificate_credential_library_attributes.gen.go @@ -40,8 +40,8 @@ func AttributesMapToVaultSSHCertificateCredentialLibraryAttributes(in map[string } func (pt *CredentialLibrary) GetVaultSSHCertificateCredentialLibraryAttributes() (*VaultSSHCertificateCredentialLibraryAttributes, error) { - if pt.Type != "vaultsshcertificate" { - return nil, fmt.Errorf("asked to fetch %s-type attributes but credential-library is of type %s", "vaultsshcertificate", pt.Type) + if pt.Type != "vault-ssh-certificate" { + return nil, fmt.Errorf("asked to fetch %s-type attributes but credential-library is of type %s", "vault-ssh-certificate", pt.Type) } return AttributesMapToVaultSSHCertificateCredentialLibraryAttributes(pt.Attributes) } diff --git a/api/credentials/ssh_private_key_attributes.gen.go b/api/credentials/ssh_private_key_attributes.gen.go index 26e8466a9..c473d7531 100644 --- a/api/credentials/ssh_private_key_attributes.gen.go +++ b/api/credentials/ssh_private_key_attributes.gen.go @@ -37,8 +37,8 @@ func AttributesMapToSshPrivateKeyAttributes(in map[string]interface{}) (*SshPriv } func (pt *Credential) GetSshPrivateKeyAttributes() (*SshPrivateKeyAttributes, error) { - if pt.Type != "sshprivatekey" { - return nil, fmt.Errorf("asked to fetch %s-type attributes but credential is of type %s", "sshprivatekey", pt.Type) + if pt.Type != "ssh_private_key" { + return nil, fmt.Errorf("asked to fetch %s-type attributes but credential is of type %s", "ssh_private_key", pt.Type) } return AttributesMapToSshPrivateKeyAttributes(pt.Attributes) } diff --git a/api/credentials/username_password_attributes.gen.go b/api/credentials/username_password_attributes.gen.go index 0a3dd4cdd..a79715bd5 100644 --- a/api/credentials/username_password_attributes.gen.go +++ b/api/credentials/username_password_attributes.gen.go @@ -35,8 +35,8 @@ func AttributesMapToUsernamePasswordAttributes(in map[string]interface{}) (*User } func (pt *Credential) GetUsernamePasswordAttributes() (*UsernamePasswordAttributes, error) { - if pt.Type != "usernamepassword" { - return nil, fmt.Errorf("asked to fetch %s-type attributes but credential is of type %s", "usernamepassword", pt.Type) + if pt.Type != "username_password" { + return nil, fmt.Errorf("asked to fetch %s-type attributes but credential is of type %s", "username_password", pt.Type) } return AttributesMapToUsernamePasswordAttributes(pt.Attributes) } diff --git a/api/sessionrecordings/credential.gen.go b/api/sessionrecordings/credential.gen.go new file mode 100644 index 000000000..00571450f --- /dev/null +++ b/api/sessionrecordings/credential.gen.go @@ -0,0 +1,15 @@ +// Code generated by "make api"; DO NOT EDIT. +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +package sessionrecordings + +type Credential struct { + Id string `json:"id,omitempty"` + CredentialStore *CredentialStore `json:"credential_store,omitempty"` + Name string `json:"name,omitempty"` + Description string `json:"description,omitempty"` + Purposes []string `json:"purposes,omitempty"` + Type string `json:"type,omitempty"` + Attributes map[string]interface{} `json:"attributes,omitempty"` +} diff --git a/api/sessionrecordings/credential_library.gen.go b/api/sessionrecordings/credential_library.gen.go new file mode 100644 index 000000000..f74db0ab6 --- /dev/null +++ b/api/sessionrecordings/credential_library.gen.go @@ -0,0 +1,15 @@ +// Code generated by "make api"; DO NOT EDIT. +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +package sessionrecordings + +type CredentialLibrary struct { + Id string `json:"id,omitempty"` + CredentialStore *CredentialStore `json:"credential_store,omitempty"` + Name string `json:"name,omitempty"` + Description string `json:"description,omitempty"` + Purposes []string `json:"purposes,omitempty"` + Type string `json:"type,omitempty"` + Attributes map[string]interface{} `json:"attributes,omitempty"` +} diff --git a/api/sessionrecordings/credential_store.gen.go b/api/sessionrecordings/credential_store.gen.go new file mode 100644 index 000000000..0c8ecfa9c --- /dev/null +++ b/api/sessionrecordings/credential_store.gen.go @@ -0,0 +1,14 @@ +// Code generated by "make api"; DO NOT EDIT. +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +package sessionrecordings + +type CredentialStore struct { + Id string `json:"id,omitempty"` + ScopeId string `json:"scope_id,omitempty"` + Name string `json:"name,omitempty"` + Description string `json:"description,omitempty"` + Type string `json:"type,omitempty"` + Attributes map[string]interface{} `json:"attributes,omitempty"` +} diff --git a/api/sessionrecordings/json_credential_attributes.gen.go b/api/sessionrecordings/json_credential_attributes.gen.go new file mode 100644 index 000000000..d5e801b9b --- /dev/null +++ b/api/sessionrecordings/json_credential_attributes.gen.go @@ -0,0 +1,40 @@ +// Code generated by "make api"; DO NOT EDIT. +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +package sessionrecordings + +import ( + "fmt" + + "github.com/mitchellh/mapstructure" +) + +type JsonCredentialAttributes struct { + ObjectHmac string `json:"object_hmac,omitempty"` +} + +func AttributesMapToJsonCredentialAttributes(in map[string]interface{}) (*JsonCredentialAttributes, error) { + if in == nil { + return nil, fmt.Errorf("nil input map") + } + var out JsonCredentialAttributes + dec, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{ + Result: &out, + TagName: "json", + }) + if err != nil { + return nil, fmt.Errorf("error creating mapstructure decoder: %w", err) + } + if err := dec.Decode(in); err != nil { + return nil, fmt.Errorf("error decoding: %w", err) + } + return &out, nil +} + +func (pt *Credential) GetJsonCredentialAttributes() (*JsonCredentialAttributes, error) { + if pt.Type != "json" { + return nil, fmt.Errorf("asked to fetch %s-type attributes but credential is of type %s", "json", pt.Type) + } + return AttributesMapToJsonCredentialAttributes(pt.Attributes) +} diff --git a/api/sessionrecordings/ssh_private_key_credential_attributes.gen.go b/api/sessionrecordings/ssh_private_key_credential_attributes.gen.go new file mode 100644 index 000000000..dd0293bfe --- /dev/null +++ b/api/sessionrecordings/ssh_private_key_credential_attributes.gen.go @@ -0,0 +1,42 @@ +// Code generated by "make api"; DO NOT EDIT. +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +package sessionrecordings + +import ( + "fmt" + + "github.com/mitchellh/mapstructure" +) + +type SshPrivateKeyCredentialAttributes struct { + Username string `json:"username,omitempty"` + PrivateKeyHmac string `json:"private_key_hmac,omitempty"` + PrivateKeyPassphraseHmac string `json:"private_key_passphrase_hmac,omitempty"` +} + +func AttributesMapToSshPrivateKeyCredentialAttributes(in map[string]interface{}) (*SshPrivateKeyCredentialAttributes, error) { + if in == nil { + return nil, fmt.Errorf("nil input map") + } + var out SshPrivateKeyCredentialAttributes + dec, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{ + Result: &out, + TagName: "json", + }) + if err != nil { + return nil, fmt.Errorf("error creating mapstructure decoder: %w", err) + } + if err := dec.Decode(in); err != nil { + return nil, fmt.Errorf("error decoding: %w", err) + } + return &out, nil +} + +func (pt *Credential) GetSshPrivateKeyCredentialAttributes() (*SshPrivateKeyCredentialAttributes, error) { + if pt.Type != "ssh_private_key" { + return nil, fmt.Errorf("asked to fetch %s-type attributes but credential is of type %s", "ssh_private_key", pt.Type) + } + return AttributesMapToSshPrivateKeyCredentialAttributes(pt.Attributes) +} diff --git a/api/sessionrecordings/username_password_credential_attributes.gen.go b/api/sessionrecordings/username_password_credential_attributes.gen.go new file mode 100644 index 000000000..c9860c6bd --- /dev/null +++ b/api/sessionrecordings/username_password_credential_attributes.gen.go @@ -0,0 +1,41 @@ +// Code generated by "make api"; DO NOT EDIT. +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +package sessionrecordings + +import ( + "fmt" + + "github.com/mitchellh/mapstructure" +) + +type UsernamePasswordCredentialAttributes struct { + Username string `json:"username,omitempty"` + PasswordHmac string `json:"password_hmac,omitempty"` +} + +func AttributesMapToUsernamePasswordCredentialAttributes(in map[string]interface{}) (*UsernamePasswordCredentialAttributes, error) { + if in == nil { + return nil, fmt.Errorf("nil input map") + } + var out UsernamePasswordCredentialAttributes + dec, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{ + Result: &out, + TagName: "json", + }) + if err != nil { + return nil, fmt.Errorf("error creating mapstructure decoder: %w", err) + } + if err := dec.Decode(in); err != nil { + return nil, fmt.Errorf("error decoding: %w", err) + } + return &out, nil +} + +func (pt *Credential) GetUsernamePasswordCredentialAttributes() (*UsernamePasswordCredentialAttributes, error) { + if pt.Type != "username_password" { + return nil, fmt.Errorf("asked to fetch %s-type attributes but credential is of type %s", "username_password", pt.Type) + } + return AttributesMapToUsernamePasswordCredentialAttributes(pt.Attributes) +} diff --git a/api/sessionrecordings/values_at_time.gen.go b/api/sessionrecordings/values_at_time.gen.go index d39bbe220..7e8c0dbc5 100644 --- a/api/sessionrecordings/values_at_time.gen.go +++ b/api/sessionrecordings/values_at_time.gen.go @@ -5,7 +5,9 @@ package sessionrecordings type ValuesAtTime struct { - User *User `json:"user,omitempty"` - Target *Target `json:"target,omitempty"` - Host *Host `json:"host,omitempty"` + User *User `json:"user,omitempty"` + Target *Target `json:"target,omitempty"` + Host *Host `json:"host,omitempty"` + Credentials []*Credential `json:"credentials,omitempty"` + CredentialLibraries []*CredentialLibrary `json:"credential_libraries,omitempty"` } diff --git a/api/sessionrecordings/vault_credential_library_attributes.gen.go b/api/sessionrecordings/vault_credential_library_attributes.gen.go new file mode 100644 index 000000000..0ff0a7016 --- /dev/null +++ b/api/sessionrecordings/vault_credential_library_attributes.gen.go @@ -0,0 +1,42 @@ +// Code generated by "make api"; DO NOT EDIT. +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +package sessionrecordings + +import ( + "fmt" + + "github.com/mitchellh/mapstructure" +) + +type VaultCredentialLibraryAttributes struct { + Path string `json:"path,omitempty"` + HttpMethod string `json:"http_method,omitempty"` + HttpRequestBody string `json:"http_request_body,omitempty"` +} + +func AttributesMapToVaultCredentialLibraryAttributes(in map[string]interface{}) (*VaultCredentialLibraryAttributes, error) { + if in == nil { + return nil, fmt.Errorf("nil input map") + } + var out VaultCredentialLibraryAttributes + dec, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{ + Result: &out, + TagName: "json", + }) + if err != nil { + return nil, fmt.Errorf("error creating mapstructure decoder: %w", err) + } + if err := dec.Decode(in); err != nil { + return nil, fmt.Errorf("error decoding: %w", err) + } + return &out, nil +} + +func (pt *CredentialLibrary) GetVaultCredentialLibraryAttributes() (*VaultCredentialLibraryAttributes, error) { + if pt.Type != "vault-generic" { + return nil, fmt.Errorf("asked to fetch %s-type attributes but credential-library is of type %s", "vault-generic", pt.Type) + } + return AttributesMapToVaultCredentialLibraryAttributes(pt.Attributes) +} diff --git a/api/sessionrecordings/vault_credential_store_attributes.gen.go b/api/sessionrecordings/vault_credential_store_attributes.gen.go new file mode 100644 index 000000000..d0a06a986 --- /dev/null +++ b/api/sessionrecordings/vault_credential_store_attributes.gen.go @@ -0,0 +1,44 @@ +// Code generated by "make api"; DO NOT EDIT. +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +package sessionrecordings + +import ( + "fmt" + + "github.com/mitchellh/mapstructure" +) + +type VaultCredentialStoreAttributes struct { + Address string `json:"address,omitempty"` + Namespace string `json:"namespace,omitempty"` + TlsServerName string `json:"tls_server_name,omitempty"` + TlsSkipVerify bool `json:"tls_skip_verify,omitempty"` + WorkerFilter string `json:"worker_filter,omitempty"` +} + +func AttributesMapToVaultCredentialStoreAttributes(in map[string]interface{}) (*VaultCredentialStoreAttributes, error) { + if in == nil { + return nil, fmt.Errorf("nil input map") + } + var out VaultCredentialStoreAttributes + dec, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{ + Result: &out, + TagName: "json", + }) + if err != nil { + return nil, fmt.Errorf("error creating mapstructure decoder: %w", err) + } + if err := dec.Decode(in); err != nil { + return nil, fmt.Errorf("error decoding: %w", err) + } + return &out, nil +} + +func (pt *CredentialStore) GetVaultCredentialStoreAttributes() (*VaultCredentialStoreAttributes, error) { + if pt.Type != "vault" { + return nil, fmt.Errorf("asked to fetch %s-type attributes but credential-store is of type %s", "vault", pt.Type) + } + return AttributesMapToVaultCredentialStoreAttributes(pt.Attributes) +} diff --git a/api/sessionrecordings/vault_ssh_certificate_credential_library_attributes.gen.go b/api/sessionrecordings/vault_ssh_certificate_credential_library_attributes.gen.go new file mode 100644 index 000000000..4b6034889 --- /dev/null +++ b/api/sessionrecordings/vault_ssh_certificate_credential_library_attributes.gen.go @@ -0,0 +1,46 @@ +// Code generated by "make api"; DO NOT EDIT. +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +package sessionrecordings + +import ( + "fmt" + + "github.com/mitchellh/mapstructure" +) + +type VaultSSHCertificateCredentialLibraryAttributes struct { + Path string `json:"path,omitempty"` + Username string `json:"username,omitempty"` + KeyType string `json:"key_type,omitempty"` + KeyBits uint32 `json:"key_bits,omitempty"` + Ttl string `json:"ttl,omitempty"` + CriticalOptions map[string]string `json:"critical_options,omitempty"` + Extensions map[string]string `json:"extensions,omitempty"` +} + +func AttributesMapToVaultSSHCertificateCredentialLibraryAttributes(in map[string]interface{}) (*VaultSSHCertificateCredentialLibraryAttributes, error) { + if in == nil { + return nil, fmt.Errorf("nil input map") + } + var out VaultSSHCertificateCredentialLibraryAttributes + dec, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{ + Result: &out, + TagName: "json", + }) + if err != nil { + return nil, fmt.Errorf("error creating mapstructure decoder: %w", err) + } + if err := dec.Decode(in); err != nil { + return nil, fmt.Errorf("error decoding: %w", err) + } + return &out, nil +} + +func (pt *CredentialLibrary) GetVaultSSHCertificateCredentialLibraryAttributes() (*VaultSSHCertificateCredentialLibraryAttributes, error) { + if pt.Type != "vault-ssh-certificate" { + return nil, fmt.Errorf("asked to fetch %s-type attributes but credential-library is of type %s", "vault-ssh-certificate", pt.Type) + } + return AttributesMapToVaultSSHCertificateCredentialLibraryAttributes(pt.Attributes) +} diff --git a/internal/api/genapi/input.go b/internal/api/genapi/input.go index 5be4dfac2..2a5d99146 100644 --- a/internal/api/genapi/input.go +++ b/internal/api/genapi/input.go @@ -80,6 +80,11 @@ type structInfo struct { // the attributes map. subtypeName string + // subtype specifies exactly the value expected in the resource's "type" + // Field. This is used when checking if the attributes returned can be + // marshaled into a specific generated attributes struct. + subtype string + // For non-top-level collections, this can be used to indicate the name of // the argument that should be used parentTypeName string @@ -549,6 +554,7 @@ var inputStructs = []*structInfo{ inProto: &credentiallibraries.VaultCredentialLibraryAttributes{}, outFile: "credentiallibraries/vault_credential_library_attributes.gen.go", subtypeName: "VaultCredentialLibrary", + subtype: "vault-generic", fieldOverrides: []fieldInfo{ { Name: "Path", @@ -564,6 +570,7 @@ var inputStructs = []*structInfo{ inProto: &credentiallibraries.VaultSSHCertificateCredentialLibraryAttributes{}, outFile: "credentiallibraries/vault_ssh_certificate_credential_library_attributes.gen.go", subtypeName: "VaultSSHCertificateCredentialLibrary", + subtype: "vault-ssh-certificate", fieldOverrides: []fieldInfo{ { Name: "Path", @@ -626,6 +633,7 @@ var inputStructs = []*structInfo{ inProto: &credentials.UsernamePasswordAttributes{}, outFile: "credentials/username_password_attributes.gen.go", subtypeName: "UsernamePasswordCredential", + subtype: "username_password", fieldOverrides: []fieldInfo{ { Name: "Username", @@ -645,6 +653,7 @@ var inputStructs = []*structInfo{ inProto: &credentials.SshPrivateKeyAttributes{}, outFile: "credentials/ssh_private_key_attributes.gen.go", subtypeName: "SshPrivateKeyCredential", + subtype: "ssh_private_key", fieldOverrides: []fieldInfo{ { Name: "Username", @@ -1046,6 +1055,82 @@ var inputStructs = []*structInfo{ inProto: &session_recordings.HostCatalog{}, outFile: "sessionrecordings/host_catalog.gen.go", }, + { + inProto: &session_recordings.Credential{}, + outFile: "sessionrecordings/credential.gen.go", + }, + { + inProto: &session_recordings.UsernamePasswordCredentialAttributes{}, + outFile: "sessionrecordings/username_password_credential_attributes.gen.go", + subtype: "username_password", + parentTypeName: "Credential", + templates: []*template.Template{ + mapstructureConversionTemplate, + }, + }, + { + inProto: &session_recordings.JsonCredentialAttributes{}, + outFile: "sessionrecordings/json_credential_attributes.gen.go", + subtype: "json", + parentTypeName: "Credential", + templates: []*template.Template{ + mapstructureConversionTemplate, + }, + }, + { + inProto: &session_recordings.SshPrivateKeyCredentialAttributes{}, + outFile: "sessionrecordings/ssh_private_key_credential_attributes.gen.go", + subtype: "ssh_private_key", + parentTypeName: "Credential", + templates: []*template.Template{ + mapstructureConversionTemplate, + }, + }, + { + inProto: &session_recordings.CredentialLibrary{}, + outFile: "sessionrecordings/credential_library.gen.go", + }, + { + inProto: &session_recordings.VaultCredentialLibraryAttributes{}, + outFile: "sessionrecordings/vault_credential_library_attributes.gen.go", + subtype: "vault-generic", + parentTypeName: "CredentialLibrary", + templates: []*template.Template{ + mapstructureConversionTemplate, + }, + }, + { + inProto: &session_recordings.VaultSSHCertificateCredentialLibraryAttributes{}, + outFile: "sessionrecordings/vault_ssh_certificate_credential_library_attributes.gen.go", + subtype: "vault-ssh-certificate", + parentTypeName: "CredentialLibrary", + fieldOverrides: []fieldInfo{ + { + Name: "CriticalOptions", + FieldType: "map[string]string", + }, + { + Name: "Extensions", + FieldType: "map[string]string", + }, + }, + templates: []*template.Template{ + mapstructureConversionTemplate, + }, + }, + { + inProto: &session_recordings.CredentialStore{}, + outFile: "sessionrecordings/credential_store.gen.go", + }, + { + inProto: &session_recordings.VaultCredentialStoreAttributes{}, + outFile: "sessionrecordings/vault_credential_store_attributes.gen.go", + subtype: "vault", + parentTypeName: "CredentialStore", + templates: []*template.Template{ + mapstructureConversionTemplate, + }, + }, { inProto: &session_recordings.ValuesAtTime{}, outFile: "sessionrecordings/values_at_time.gen.go", diff --git a/internal/api/genapi/templates.go b/internal/api/genapi/templates.go index 3e7ead32f..8d2db9083 100644 --- a/internal/api/genapi/templates.go +++ b/internal/api/genapi/templates.go @@ -53,6 +53,7 @@ type templateInput struct { CreateResponseTypes []string SkipListFiltering bool RecursiveListing bool + Subtype string } func fillTemplates() { @@ -72,6 +73,7 @@ func fillTemplates() { CreateResponseTypes: in.createResponseTypes, SkipListFiltering: in.skipListFiltering, RecursiveListing: in.recursiveListing, + Subtype: in.subtype, } if in.packageOverride != "" { input.Package = in.packageOverride @@ -850,8 +852,8 @@ func AttributesMapTo{{ .Name }}(in map[string]interface{}) (*{{ .Name }}, error) } func (pt *{{ .ParentTypeName }}) Get{{ .Name }}() (*{{ .Name }}, error) { - if pt.Type != "{{ typeFromSubtype .Name .ParentTypeName "Attributes"}}" { - return nil, fmt.Errorf("asked to fetch %s-type attributes but {{ kebabCase .ParentTypeName }} is of type %s", "{{ typeFromSubtype .Name .ParentTypeName "Attributes"}}", pt.Type) + if pt.Type != "{{ typeFromSubtype .Subtype .Name .ParentTypeName "Attributes"}}" { + return nil, fmt.Errorf("asked to fetch %s-type attributes but {{ kebabCase .ParentTypeName }} is of type %s", "{{ typeFromSubtype .Subtype .Name .ParentTypeName "Attributes"}}", pt.Type) } return AttributesMapTo{{ .Name }}(pt.Attributes) } @@ -895,6 +897,9 @@ func removeDups(in []string) []string { return ret } -func typeFromSubtype(in, parent, extraSuffix string) string { +func typeFromSubtype(subtype, in, parent, extraSuffix string) string { + if subtype != "" { + return subtype + } return strings.ToLower(strings.TrimSuffix(strings.TrimSuffix(in, extraSuffix), parent)) } diff --git a/internal/cmd/commands/sessionrecordingscmd/funcs.go b/internal/cmd/commands/sessionrecordingscmd/funcs.go index b93033463..6c26a2d90 100644 --- a/internal/cmd/commands/sessionrecordingscmd/funcs.go +++ b/internal/cmd/commands/sessionrecordingscmd/funcs.go @@ -312,6 +312,119 @@ func printItemTable(item *sessionrecordings.SessionRecording, resp *api.Response ) } } + if len(item.CreateTimeValues.CredentialLibraries) > 0 { + ret = append(ret, + "", + " Credential Libraries:") + for _, cl := range item.CreateTimeValues.CredentialLibraries { + cm := map[string]any{ + "ID": cl.Id, + } + if cl.Name != "" { + cm["Name"] = cl.Name + } + if cl.Description != "" { + cm["Description"] = cl.Description + } + if cl.Type != "" { + cm["Type"] = cl.Type + } + if len(cl.Purposes) > 0 { + cm["Purpose"] = strings.Join(cl.Purposes, ", ") + } + if attrs, _ := cl.GetVaultSSHCertificateCredentialLibraryAttributes(); attrs != nil { + if attrs.Path != "" { + cm["Vault Path"] = attrs.Path + } + if attrs.Username != "" { + cm["Username"] = attrs.Username + } + if attrs.KeyType != "" { + cm["Key Type"] = attrs.KeyType + } + if attrs.Ttl != "" { + cm["Ttl"] = attrs.Ttl + } + } + if attrs, _ := cl.GetVaultCredentialLibraryAttributes(); attrs != nil { + if attrs.Path != "" { + cm["Vault Path"] = attrs.Path + } + if attrs.HttpMethod != "" { + cm["Http Method"] = attrs.HttpMethod + } + if attrs.HttpRequestBody != "" { + cm["Http Request Body"] = attrs.HttpRequestBody + } + } + maxLibLength := base.MaxAttributesLength(cm, nil, nil) + ret = append(ret, + base.WrapMap(4, maxLibLength, cm), + "", + ) + if cs := cl.CredentialStore; cs != nil { + csm := credStoreMap(cs) + maxStoreLength := base.MaxAttributesLength(csm, nil, nil) + ret = append(ret, + " Credential Store:", + base.WrapMap(6, maxStoreLength, csm), + "", + ) + } + } + } + + if len(item.CreateTimeValues.Credentials) > 0 { + ret = append(ret, + "", + " Credentials:") + for _, c := range item.CreateTimeValues.Credentials { + cm := map[string]any{ + "ID": c.Id, + } + if c.Name != "" { + cm["Name"] = c.Name + } + if c.Description != "" { + cm["Description"] = c.Description + } + if c.Type != "" { + cm["Type"] = c.Type + } + if len(c.Purposes) > 0 { + cm["Purpose"] = strings.Join(c.Purposes, ", ") + } + if attrs, _ := c.GetJsonCredentialAttributes(); attrs != nil { + if attrs.ObjectHmac != "" { + cm["Object HMAC"] = attrs.ObjectHmac + } + } + if attrs, _ := c.GetUsernamePasswordCredentialAttributes(); attrs != nil { + if attrs.Username != "" { + cm["Username"] = attrs.Username + } + } + if attrs, _ := c.GetSshPrivateKeyCredentialAttributes(); attrs != nil { + if attrs.Username != "" { + cm["Username"] = attrs.Username + } + } + maxLibLength := base.MaxAttributesLength(cm, nil, nil) + ret = append(ret, + base.WrapMap(4, maxLibLength, cm), + "", + ) + if cs := c.CredentialStore; cs != nil { + csm := credStoreMap(cs) + maxStoreLength := base.MaxAttributesLength(csm, nil, nil) + ret = append(ret, + " Credential Store:", + base.WrapMap(6, maxStoreLength, csm), + "", + ) + } + } + } } if len(item.ConnectionRecordings) > 0 { @@ -401,6 +514,36 @@ func printItemTable(item *sessionrecordings.SessionRecording, resp *api.Response return base.WrapForHelpText(ret) } +func credStoreMap(cs *sessionrecordings.CredentialStore) map[string]any { + csm := map[string]any{ + "ID": cs.Id, + } + if cs.Name != "" { + csm["Name"] = cs.Name + } + if cs.Description != "" { + csm["Description"] = cs.Description + } + if cs.ScopeId != "" { + csm["Scope ID"] = cs.ScopeId + } + if cs.Type != "" { + csm["Type"] = cs.Type + } + if attrs, _ := cs.GetVaultCredentialStoreAttributes(); attrs != nil { + if attrs.Address != "" { + csm["Vault Address"] = attrs.Address + } + if attrs.Namespace != "" { + csm["Namespace"] = attrs.Namespace + } + if attrs.WorkerFilter != "" { + csm["Worker Filter"] = attrs.WorkerFilter + } + } + return csm +} + func customScopeInfoForOutput(scp *scopes.ScopeInfo, maxLength int, prefixSpaces int) string { if scp == nil { return " " diff --git a/internal/gen/controller.swagger.json b/internal/gen/controller.swagger.json index f59cd01e6..082568edb 100644 --- a/internal/gen/controller.swagger.json +++ b/internal/gen/controller.swagger.json @@ -5686,6 +5686,110 @@ }, "description": "ConnectionRecording contains the recording of a single Connection within a Session." }, + "controller.api.resources.sessionrecordings.v1.Credential": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The ID of the Credential." + }, + "credential_store": { + "$ref": "#/definitions/controller.api.resources.sessionrecordings.v1.CredentialStore", + "description": "The Credential Store of which this Credential is a part." + }, + "name": { + "type": "string", + "description": "The name of the credential." + }, + "description": { + "type": "string", + "description": "Optional user-set description." + }, + "purposes": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The purposes for which this Credential was attached to the sesssion." + }, + "type": { + "type": "string", + "description": "The Credential type." + }, + "attributes": { + "type": "object", + "description": "The attributes that are applicable for the specific Credential type." + } + }, + "title": "Credential contains fields related to an Credential resource" + }, + "controller.api.resources.sessionrecordings.v1.CredentialLibrary": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The ID of the Credential Library." + }, + "credential_store": { + "$ref": "#/definitions/controller.api.resources.sessionrecordings.v1.CredentialStore", + "description": "The credential store of which this library is a part." + }, + "name": { + "type": "string", + "description": "Optional name of this Credential Library." + }, + "description": { + "type": "string", + "description": "Optional user-set description of this Credential Library." + }, + "purposes": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The purposes for which this CredentialLibrary was attached to the sesssion." + }, + "type": { + "type": "string", + "description": "The Credential Library type." + }, + "attributes": { + "type": "object", + "description": "The attributes that are applicable for the specific Credential Library type." + } + }, + "title": "CredentialLibrary contains all fields related to an Credential Library resource" + }, + "controller.api.resources.sessionrecordings.v1.CredentialStore": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The ID of the Credential Store." + }, + "scope_id": { + "type": "string", + "description": "The ID of the Scope of which this Credential Store is a part." + }, + "name": { + "type": "string", + "description": "The name for identification purposes if set." + }, + "description": { + "type": "string", + "description": "The description for identification purposes if set." + }, + "type": { + "type": "string", + "description": "The Credential Store type." + }, + "attributes": { + "type": "object", + "description": "The attributes that are applicable for the specific Credential Store type." + } + }, + "title": "CredentialStore contains all fields related to a Credential Store resource" + }, "controller.api.resources.sessionrecordings.v1.Host": { "type": "object", "properties": { @@ -5951,6 +6055,22 @@ "host": { "$ref": "#/definitions/controller.api.resources.sessionrecordings.v1.Host", "description": "Information about the Host chosen for the session." + }, + "credentials": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/controller.api.resources.sessionrecordings.v1.Credential" + }, + "description": "Information about the Credentials used for this session." + }, + "credential_libraries": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/controller.api.resources.sessionrecordings.v1.CredentialLibrary" + }, + "description": "Information about the Credential Libraries used for this session." } }, "description": "ValuesAtTime contain information about other Boundary resources as they\nwere at a certain time through the lifetime of the Session Recording." diff --git a/internal/proto/controller/api/resources/sessionrecordings/v1/session_recording.proto b/internal/proto/controller/api/resources/sessionrecordings/v1/session_recording.proto index 06131e920..27ac940e8 100644 --- a/internal/proto/controller/api/resources/sessionrecordings/v1/session_recording.proto +++ b/internal/proto/controller/api/resources/sessionrecordings/v1/session_recording.proto @@ -218,6 +218,162 @@ message SshTargetAttributes { uint32 default_client_port = 2 [json_name = "default_client_port"]; // @gotags: class:"public" } +// CredentialStore contains all fields related to a Credential Store resource +message CredentialStore { + // The ID of the Credential Store. + string id = 1; // @gotags: class:"public" + + // The ID of the Scope of which this Credential Store is a part. + string scope_id = 2 [json_name = "scope_id"]; // @gotags: class:"public" + + // The name for identification purposes if set. + string name = 3; // @gotags: class:"public" + + // The description for identification purposes if set. + string description = 4; // @gotags: class:"public" + + // The Credential Store type. + string type = 5; // @gotags: class:"public" + + oneof attrs { + // The attributes that are applicable for the specific Credential Store type. + google.protobuf.Struct attributes = 6; + } +} + +// The attributes of a vault typed Credential Store. +message VaultCredentialStoreAttributes { + // The complete url address of vault. + string address = 1; // @gotags: class:"public" + + // The namespace of vault used by this store + string namespace = 2; // @gotags: class:"public" + + // The value to use as the SNI host when connecting to vault via TLS. + string tls_server_name = 3 [json_name = "tls_server_name"]; // @gotags: class:"public" + + // Indicates if verification of the TLS certificate is disabled. + bool tls_skip_verify = 4 [json_name = "tls_skip_verify"]; // @gotags: class:"public" + + // Filters to the worker(s) who can handle Vault requests for this cred store if set. + string worker_filter = 5 [json_name = "worker_filter"]; // @gotags: class:"public" +} + +// Credential contains fields related to an Credential resource +message Credential { + // The ID of the Credential. + string id = 1; // @gotags: class:"public" + + // The Credential Store of which this Credential is a part. + CredentialStore credential_store = 2 [json_name = "credential_store"]; // @gotags: class:"public" + + // The name of the credential. + string name = 3; // @gotags: class:"public" + + // Optional user-set description. + string description = 4; // @gotags: class:"public" + + // The purposes for which this Credential was attached to the sesssion. + repeated string purposes = 5; + + // The Credential type. + string type = 6; // @gotags: class:"public" + + oneof attrs { + // The attributes that are applicable for the specific Credential type. + google.protobuf.Struct attributes = 7; + } +} + +// The attributes of a UsernamePassword Credential. +message UsernamePasswordCredentialAttributes { + // The username associated with the credential. + string username = 1; // @gotags: class:"public" + + // The hmac value of the password. + string password_hmac = 2; // @gotags: class:"public" +} + +// The attributes of a SshPrivateKey Credential. +message SshPrivateKeyCredentialAttributes { + // The username associated with the credential. + string username = 1; // @gotags: class:"public" + + // The hmac value of the SSH private key. + string private_key_hmac = 2; // @gotags: class:"public" + + // The hmac value of the SSH private key passphrase. + string private_key_passphrase_hmac = 3; // @gotags: class:"public" +} + +// The attributes of a JSON Credential. +message JsonCredentialAttributes { + // The hmac value of the object. + string object_hmac = 1; // @gotags: class:"public" +} + +// CredentialLibrary contains all fields related to an Credential Library resource +message CredentialLibrary { + // The ID of the Credential Library. + string id = 1; // @gotags: class:"public" + + // The credential store of which this library is a part. + CredentialStore credential_store = 2 [json_name = "credential_store"]; // @gotags: class:"public" + + // Optional name of this Credential Library. + string name = 3; // @gotags: class:"public" + + // Optional user-set description of this Credential Library. + string description = 4; // @gotags: class:"public" + + // The purposes for which this CredentialLibrary was attached to the sesssion. + repeated string purposes = 5; + + // The Credential Library type. + string type = 6; // @gotags: class:"public" + + oneof attrs { + // The attributes that are applicable for the specific Credential Library type. + google.protobuf.Struct attributes = 7; + } +} + +// The attributes of a vault typed Credential Library. +message VaultCredentialLibraryAttributes { + // The path in Vault to request credentials from. + string path = 1; // @gotags: class:"public" + + // The HTTP method the library uses to communicate with Vault. + string http_method = 2; // @gotags: class:"public" + + // The body of the HTTP request the library sends to vault. + string http_request_body = 3; // @gotags: `class:"secret"` +} + +// The attributes of a vault SSH Certificate Credential Library. +message VaultSSHCertificateCredentialLibraryAttributes { + // The path in Vault to request credentials from. + string path = 1; // @gotags: class:"public" + + // The username used when making an SSH connection. + string username = 2; // @gotags: `class:"sensitive"` + + // The key type to use when generating an SSH private key. + string key_type = 3; // @gotags: class:"public" + + // The number of bits to use to generate an SSH private key. + uint32 key_bits = 4; // @gotags: class:"public" + + // The requested time to live for the certificate. + string ttl = 5; // @gotags: class:"public" + + // The critical options that the certificate should be signed for. + map critical_options = 6; // @gotags: class:"public" + + // The extensions that the certificate should be signed for. + map extensions = 7; // @gotags: class:"public" +} + // ValuesAtTime contain information about other Boundary resources as they // were at a certain time through the lifetime of the Session Recording. message ValuesAtTime { @@ -229,6 +385,12 @@ message ValuesAtTime { // Information about the Host chosen for the session. Host host = 3; // @gotags: class:"public" + + // Information about the Credentials used for this session. + repeated Credential credentials = 4; + + // Information about the Credential Libraries used for this session. + repeated CredentialLibrary credential_libraries = 5 [json_name = "credential_libraries"]; } // SessionRecording contains information about the recording of a Session. diff --git a/sdk/pbs/controller/api/resources/session_recordings/session_recording.pb.go b/sdk/pbs/controller/api/resources/session_recordings/session_recording.pb.go index df1018d61..aa2268d5f 100644 --- a/sdk/pbs/controller/api/resources/session_recordings/session_recording.pb.go +++ b/sdk/pbs/controller/api/resources/session_recordings/session_recording.pb.go @@ -883,6 +883,795 @@ func (x *SshTargetAttributes) GetDefaultClientPort() uint32 { return 0 } +// CredentialStore contains all fields related to a Credential Store resource +type CredentialStore struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The ID of the Credential Store. + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty" class:"public"` // @gotags: class:"public" + // The ID of the Scope of which this Credential Store is a part. + ScopeId string `protobuf:"bytes,2,opt,name=scope_id,proto3" json:"scope_id,omitempty" class:"public"` // @gotags: class:"public" + // The name for identification purposes if set. + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty" class:"public"` // @gotags: class:"public" + // The description for identification purposes if set. + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty" class:"public"` // @gotags: class:"public" + // The Credential Store type. + Type string `protobuf:"bytes,5,opt,name=type,proto3" json:"type,omitempty" class:"public"` // @gotags: class:"public" + // Types that are assignable to Attrs: + // + // *CredentialStore_Attributes + Attrs isCredentialStore_Attrs `protobuf_oneof:"attrs"` +} + +func (x *CredentialStore) Reset() { + *x = CredentialStore{} + if protoimpl.UnsafeEnabled { + mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CredentialStore) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CredentialStore) ProtoMessage() {} + +func (x *CredentialStore) ProtoReflect() protoreflect.Message { + mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CredentialStore.ProtoReflect.Descriptor instead. +func (*CredentialStore) Descriptor() ([]byte, []int) { + return file_controller_api_resources_sessionrecordings_v1_session_recording_proto_rawDescGZIP(), []int{8} +} + +func (x *CredentialStore) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *CredentialStore) GetScopeId() string { + if x != nil { + return x.ScopeId + } + return "" +} + +func (x *CredentialStore) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CredentialStore) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *CredentialStore) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (m *CredentialStore) GetAttrs() isCredentialStore_Attrs { + if m != nil { + return m.Attrs + } + return nil +} + +func (x *CredentialStore) GetAttributes() *structpb.Struct { + if x, ok := x.GetAttrs().(*CredentialStore_Attributes); ok { + return x.Attributes + } + return nil +} + +type isCredentialStore_Attrs interface { + isCredentialStore_Attrs() +} + +type CredentialStore_Attributes struct { + // The attributes that are applicable for the specific Credential Store type. + Attributes *structpb.Struct `protobuf:"bytes,6,opt,name=attributes,proto3,oneof"` +} + +func (*CredentialStore_Attributes) isCredentialStore_Attrs() {} + +// The attributes of a vault typed Credential Store. +type VaultCredentialStoreAttributes struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The complete url address of vault. + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty" class:"public"` // @gotags: class:"public" + // The namespace of vault used by this store + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty" class:"public"` // @gotags: class:"public" + // The value to use as the SNI host when connecting to vault via TLS. + TlsServerName string `protobuf:"bytes,3,opt,name=tls_server_name,proto3" json:"tls_server_name,omitempty" class:"public"` // @gotags: class:"public" + // Indicates if verification of the TLS certificate is disabled. + TlsSkipVerify bool `protobuf:"varint,4,opt,name=tls_skip_verify,proto3" json:"tls_skip_verify,omitempty" class:"public"` // @gotags: class:"public" + // Filters to the worker(s) who can handle Vault requests for this cred store if set. + WorkerFilter string `protobuf:"bytes,5,opt,name=worker_filter,proto3" json:"worker_filter,omitempty" class:"public"` // @gotags: class:"public" +} + +func (x *VaultCredentialStoreAttributes) Reset() { + *x = VaultCredentialStoreAttributes{} + if protoimpl.UnsafeEnabled { + mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VaultCredentialStoreAttributes) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VaultCredentialStoreAttributes) ProtoMessage() {} + +func (x *VaultCredentialStoreAttributes) ProtoReflect() protoreflect.Message { + mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VaultCredentialStoreAttributes.ProtoReflect.Descriptor instead. +func (*VaultCredentialStoreAttributes) Descriptor() ([]byte, []int) { + return file_controller_api_resources_sessionrecordings_v1_session_recording_proto_rawDescGZIP(), []int{9} +} + +func (x *VaultCredentialStoreAttributes) GetAddress() string { + if x != nil { + return x.Address + } + return "" +} + +func (x *VaultCredentialStoreAttributes) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *VaultCredentialStoreAttributes) GetTlsServerName() string { + if x != nil { + return x.TlsServerName + } + return "" +} + +func (x *VaultCredentialStoreAttributes) GetTlsSkipVerify() bool { + if x != nil { + return x.TlsSkipVerify + } + return false +} + +func (x *VaultCredentialStoreAttributes) GetWorkerFilter() string { + if x != nil { + return x.WorkerFilter + } + return "" +} + +// Credential contains fields related to an Credential resource +type Credential struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The ID of the Credential. + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty" class:"public"` // @gotags: class:"public" + // The Credential Store of which this Credential is a part. + CredentialStore *CredentialStore `protobuf:"bytes,2,opt,name=credential_store,proto3" json:"credential_store,omitempty" class:"public"` // @gotags: class:"public" + // The name of the credential. + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty" class:"public"` // @gotags: class:"public" + // Optional user-set description. + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty" class:"public"` // @gotags: class:"public" + // The purposes for which this Credential was attached to the sesssion. + Purposes []string `protobuf:"bytes,5,rep,name=purposes,proto3" json:"purposes,omitempty"` + // The Credential type. + Type string `protobuf:"bytes,6,opt,name=type,proto3" json:"type,omitempty" class:"public"` // @gotags: class:"public" + // Types that are assignable to Attrs: + // + // *Credential_Attributes + Attrs isCredential_Attrs `protobuf_oneof:"attrs"` +} + +func (x *Credential) Reset() { + *x = Credential{} + if protoimpl.UnsafeEnabled { + mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Credential) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Credential) ProtoMessage() {} + +func (x *Credential) ProtoReflect() protoreflect.Message { + mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Credential.ProtoReflect.Descriptor instead. +func (*Credential) Descriptor() ([]byte, []int) { + return file_controller_api_resources_sessionrecordings_v1_session_recording_proto_rawDescGZIP(), []int{10} +} + +func (x *Credential) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *Credential) GetCredentialStore() *CredentialStore { + if x != nil { + return x.CredentialStore + } + return nil +} + +func (x *Credential) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Credential) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Credential) GetPurposes() []string { + if x != nil { + return x.Purposes + } + return nil +} + +func (x *Credential) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (m *Credential) GetAttrs() isCredential_Attrs { + if m != nil { + return m.Attrs + } + return nil +} + +func (x *Credential) GetAttributes() *structpb.Struct { + if x, ok := x.GetAttrs().(*Credential_Attributes); ok { + return x.Attributes + } + return nil +} + +type isCredential_Attrs interface { + isCredential_Attrs() +} + +type Credential_Attributes struct { + // The attributes that are applicable for the specific Credential type. + Attributes *structpb.Struct `protobuf:"bytes,7,opt,name=attributes,proto3,oneof"` +} + +func (*Credential_Attributes) isCredential_Attrs() {} + +// The attributes of a UsernamePassword Credential. +type UsernamePasswordCredentialAttributes struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The username associated with the credential. + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty" class:"public"` // @gotags: class:"public" + // The hmac value of the password. + PasswordHmac string `protobuf:"bytes,2,opt,name=password_hmac,json=passwordHmac,proto3" json:"password_hmac,omitempty" class:"public"` // @gotags: class:"public" +} + +func (x *UsernamePasswordCredentialAttributes) Reset() { + *x = UsernamePasswordCredentialAttributes{} + if protoimpl.UnsafeEnabled { + mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UsernamePasswordCredentialAttributes) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UsernamePasswordCredentialAttributes) ProtoMessage() {} + +func (x *UsernamePasswordCredentialAttributes) ProtoReflect() protoreflect.Message { + mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UsernamePasswordCredentialAttributes.ProtoReflect.Descriptor instead. +func (*UsernamePasswordCredentialAttributes) Descriptor() ([]byte, []int) { + return file_controller_api_resources_sessionrecordings_v1_session_recording_proto_rawDescGZIP(), []int{11} +} + +func (x *UsernamePasswordCredentialAttributes) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *UsernamePasswordCredentialAttributes) GetPasswordHmac() string { + if x != nil { + return x.PasswordHmac + } + return "" +} + +// The attributes of a SshPrivateKey Credential. +type SshPrivateKeyCredentialAttributes struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The username associated with the credential. + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty" class:"public"` // @gotags: class:"public" + // The hmac value of the SSH private key. + PrivateKeyHmac string `protobuf:"bytes,2,opt,name=private_key_hmac,json=privateKeyHmac,proto3" json:"private_key_hmac,omitempty" class:"public"` // @gotags: class:"public" + // The hmac value of the SSH private key passphrase. + PrivateKeyPassphraseHmac string `protobuf:"bytes,3,opt,name=private_key_passphrase_hmac,json=privateKeyPassphraseHmac,proto3" json:"private_key_passphrase_hmac,omitempty" class:"public"` // @gotags: class:"public" +} + +func (x *SshPrivateKeyCredentialAttributes) Reset() { + *x = SshPrivateKeyCredentialAttributes{} + if protoimpl.UnsafeEnabled { + mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SshPrivateKeyCredentialAttributes) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SshPrivateKeyCredentialAttributes) ProtoMessage() {} + +func (x *SshPrivateKeyCredentialAttributes) ProtoReflect() protoreflect.Message { + mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[12] + 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 SshPrivateKeyCredentialAttributes.ProtoReflect.Descriptor instead. +func (*SshPrivateKeyCredentialAttributes) Descriptor() ([]byte, []int) { + return file_controller_api_resources_sessionrecordings_v1_session_recording_proto_rawDescGZIP(), []int{12} +} + +func (x *SshPrivateKeyCredentialAttributes) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *SshPrivateKeyCredentialAttributes) GetPrivateKeyHmac() string { + if x != nil { + return x.PrivateKeyHmac + } + return "" +} + +func (x *SshPrivateKeyCredentialAttributes) GetPrivateKeyPassphraseHmac() string { + if x != nil { + return x.PrivateKeyPassphraseHmac + } + return "" +} + +// The attributes of a JSON Credential. +type JsonCredentialAttributes struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The hmac value of the object. + ObjectHmac string `protobuf:"bytes,1,opt,name=object_hmac,json=objectHmac,proto3" json:"object_hmac,omitempty" class:"public"` // @gotags: class:"public" +} + +func (x *JsonCredentialAttributes) Reset() { + *x = JsonCredentialAttributes{} + if protoimpl.UnsafeEnabled { + mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *JsonCredentialAttributes) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JsonCredentialAttributes) ProtoMessage() {} + +func (x *JsonCredentialAttributes) ProtoReflect() protoreflect.Message { + mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[13] + 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 JsonCredentialAttributes.ProtoReflect.Descriptor instead. +func (*JsonCredentialAttributes) Descriptor() ([]byte, []int) { + return file_controller_api_resources_sessionrecordings_v1_session_recording_proto_rawDescGZIP(), []int{13} +} + +func (x *JsonCredentialAttributes) GetObjectHmac() string { + if x != nil { + return x.ObjectHmac + } + return "" +} + +// CredentialLibrary contains all fields related to an Credential Library resource +type CredentialLibrary struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The ID of the Credential Library. + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty" class:"public"` // @gotags: class:"public" + // The credential store of which this library is a part. + CredentialStore *CredentialStore `protobuf:"bytes,2,opt,name=credential_store,proto3" json:"credential_store,omitempty" class:"public"` // @gotags: class:"public" + // Optional name of this Credential Library. + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty" class:"public"` // @gotags: class:"public" + // Optional user-set description of this Credential Library. + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty" class:"public"` // @gotags: class:"public" + // The purposes for which this CredentialLibrary was attached to the sesssion. + Purposes []string `protobuf:"bytes,5,rep,name=purposes,proto3" json:"purposes,omitempty"` + // The Credential Library type. + Type string `protobuf:"bytes,6,opt,name=type,proto3" json:"type,omitempty" class:"public"` // @gotags: class:"public" + // Types that are assignable to Attrs: + // + // *CredentialLibrary_Attributes + Attrs isCredentialLibrary_Attrs `protobuf_oneof:"attrs"` +} + +func (x *CredentialLibrary) Reset() { + *x = CredentialLibrary{} + if protoimpl.UnsafeEnabled { + mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CredentialLibrary) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CredentialLibrary) ProtoMessage() {} + +func (x *CredentialLibrary) ProtoReflect() protoreflect.Message { + mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[14] + 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 CredentialLibrary.ProtoReflect.Descriptor instead. +func (*CredentialLibrary) Descriptor() ([]byte, []int) { + return file_controller_api_resources_sessionrecordings_v1_session_recording_proto_rawDescGZIP(), []int{14} +} + +func (x *CredentialLibrary) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *CredentialLibrary) GetCredentialStore() *CredentialStore { + if x != nil { + return x.CredentialStore + } + return nil +} + +func (x *CredentialLibrary) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CredentialLibrary) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *CredentialLibrary) GetPurposes() []string { + if x != nil { + return x.Purposes + } + return nil +} + +func (x *CredentialLibrary) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (m *CredentialLibrary) GetAttrs() isCredentialLibrary_Attrs { + if m != nil { + return m.Attrs + } + return nil +} + +func (x *CredentialLibrary) GetAttributes() *structpb.Struct { + if x, ok := x.GetAttrs().(*CredentialLibrary_Attributes); ok { + return x.Attributes + } + return nil +} + +type isCredentialLibrary_Attrs interface { + isCredentialLibrary_Attrs() +} + +type CredentialLibrary_Attributes struct { + // The attributes that are applicable for the specific Credential Library type. + Attributes *structpb.Struct `protobuf:"bytes,7,opt,name=attributes,proto3,oneof"` +} + +func (*CredentialLibrary_Attributes) isCredentialLibrary_Attrs() {} + +// The attributes of a vault typed Credential Library. +type VaultCredentialLibraryAttributes struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The path in Vault to request credentials from. + Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty" class:"public"` // @gotags: class:"public" + // The HTTP method the library uses to communicate with Vault. + HttpMethod string `protobuf:"bytes,2,opt,name=http_method,json=httpMethod,proto3" json:"http_method,omitempty" class:"public"` // @gotags: class:"public" + // The body of the HTTP request the library sends to vault. + HttpRequestBody string `protobuf:"bytes,3,opt,name=http_request_body,json=httpRequestBody,proto3" json:"http_request_body,omitempty" class:"secret"` // @gotags: `class:"secret"` +} + +func (x *VaultCredentialLibraryAttributes) Reset() { + *x = VaultCredentialLibraryAttributes{} + if protoimpl.UnsafeEnabled { + mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VaultCredentialLibraryAttributes) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VaultCredentialLibraryAttributes) ProtoMessage() {} + +func (x *VaultCredentialLibraryAttributes) ProtoReflect() protoreflect.Message { + mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[15] + 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 VaultCredentialLibraryAttributes.ProtoReflect.Descriptor instead. +func (*VaultCredentialLibraryAttributes) Descriptor() ([]byte, []int) { + return file_controller_api_resources_sessionrecordings_v1_session_recording_proto_rawDescGZIP(), []int{15} +} + +func (x *VaultCredentialLibraryAttributes) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +func (x *VaultCredentialLibraryAttributes) GetHttpMethod() string { + if x != nil { + return x.HttpMethod + } + return "" +} + +func (x *VaultCredentialLibraryAttributes) GetHttpRequestBody() string { + if x != nil { + return x.HttpRequestBody + } + return "" +} + +// The attributes of a vault SSH Certificate Credential Library. +type VaultSSHCertificateCredentialLibraryAttributes struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The path in Vault to request credentials from. + Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty" class:"public"` // @gotags: class:"public" + // The username used when making an SSH connection. + Username string `protobuf:"bytes,2,opt,name=username,proto3" json:"username,omitempty" class:"sensitive"` // @gotags: `class:"sensitive"` + // The key type to use when generating an SSH private key. + KeyType string `protobuf:"bytes,3,opt,name=key_type,json=keyType,proto3" json:"key_type,omitempty" class:"public"` // @gotags: class:"public" + // The number of bits to use to generate an SSH private key. + KeyBits uint32 `protobuf:"varint,4,opt,name=key_bits,json=keyBits,proto3" json:"key_bits,omitempty" class:"public"` // @gotags: class:"public" + // The requested time to live for the certificate. + Ttl string `protobuf:"bytes,5,opt,name=ttl,proto3" json:"ttl,omitempty" class:"public"` // @gotags: class:"public" + // The critical options that the certificate should be signed for. + CriticalOptions map[string]string `protobuf:"bytes,6,rep,name=critical_options,json=criticalOptions,proto3" json:"critical_options,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3" class:"public"` // @gotags: class:"public" + // The extensions that the certificate should be signed for. + Extensions map[string]string `protobuf:"bytes,7,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3" class:"public"` // @gotags: class:"public" +} + +func (x *VaultSSHCertificateCredentialLibraryAttributes) Reset() { + *x = VaultSSHCertificateCredentialLibraryAttributes{} + if protoimpl.UnsafeEnabled { + mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VaultSSHCertificateCredentialLibraryAttributes) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VaultSSHCertificateCredentialLibraryAttributes) ProtoMessage() {} + +func (x *VaultSSHCertificateCredentialLibraryAttributes) ProtoReflect() protoreflect.Message { + mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[16] + 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 VaultSSHCertificateCredentialLibraryAttributes.ProtoReflect.Descriptor instead. +func (*VaultSSHCertificateCredentialLibraryAttributes) Descriptor() ([]byte, []int) { + return file_controller_api_resources_sessionrecordings_v1_session_recording_proto_rawDescGZIP(), []int{16} +} + +func (x *VaultSSHCertificateCredentialLibraryAttributes) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +func (x *VaultSSHCertificateCredentialLibraryAttributes) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *VaultSSHCertificateCredentialLibraryAttributes) GetKeyType() string { + if x != nil { + return x.KeyType + } + return "" +} + +func (x *VaultSSHCertificateCredentialLibraryAttributes) GetKeyBits() uint32 { + if x != nil { + return x.KeyBits + } + return 0 +} + +func (x *VaultSSHCertificateCredentialLibraryAttributes) GetTtl() string { + if x != nil { + return x.Ttl + } + return "" +} + +func (x *VaultSSHCertificateCredentialLibraryAttributes) GetCriticalOptions() map[string]string { + if x != nil { + return x.CriticalOptions + } + return nil +} + +func (x *VaultSSHCertificateCredentialLibraryAttributes) GetExtensions() map[string]string { + if x != nil { + return x.Extensions + } + return nil +} + // ValuesAtTime contain information about other Boundary resources as they // were at a certain time through the lifetime of the Session Recording. type ValuesAtTime struct { @@ -896,12 +1685,16 @@ type ValuesAtTime struct { Target *Target `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty" class:"public"` // @gotags: class:"public" // Information about the Host chosen for the session. Host *Host `protobuf:"bytes,3,opt,name=host,proto3" json:"host,omitempty" class:"public"` // @gotags: class:"public" + // Information about the Credentials used for this session. + Credentials []*Credential `protobuf:"bytes,4,rep,name=credentials,proto3" json:"credentials,omitempty"` + // Information about the Credential Libraries used for this session. + CredentialLibraries []*CredentialLibrary `protobuf:"bytes,5,rep,name=credential_libraries,proto3" json:"credential_libraries,omitempty"` } func (x *ValuesAtTime) Reset() { *x = ValuesAtTime{} if protoimpl.UnsafeEnabled { - mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[8] + mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -914,7 +1707,7 @@ func (x *ValuesAtTime) String() string { func (*ValuesAtTime) ProtoMessage() {} func (x *ValuesAtTime) ProtoReflect() protoreflect.Message { - mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[8] + mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -927,7 +1720,7 @@ func (x *ValuesAtTime) ProtoReflect() protoreflect.Message { // Deprecated: Use ValuesAtTime.ProtoReflect.Descriptor instead. func (*ValuesAtTime) Descriptor() ([]byte, []int) { - return file_controller_api_resources_sessionrecordings_v1_session_recording_proto_rawDescGZIP(), []int{8} + return file_controller_api_resources_sessionrecordings_v1_session_recording_proto_rawDescGZIP(), []int{17} } func (x *ValuesAtTime) GetUser() *User { @@ -951,6 +1744,20 @@ func (x *ValuesAtTime) GetHost() *Host { return nil } +func (x *ValuesAtTime) GetCredentials() []*Credential { + if x != nil { + return x.Credentials + } + return nil +} + +func (x *ValuesAtTime) GetCredentialLibraries() []*CredentialLibrary { + if x != nil { + return x.CredentialLibraries + } + return nil +} + // SessionRecording contains information about the recording of a Session. type SessionRecording struct { state protoimpl.MessageState @@ -1012,7 +1819,7 @@ type SessionRecording struct { func (x *SessionRecording) Reset() { *x = SessionRecording{} if protoimpl.UnsafeEnabled { - mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[9] + mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1025,7 +1832,7 @@ func (x *SessionRecording) String() string { func (*SessionRecording) ProtoMessage() {} func (x *SessionRecording) ProtoReflect() protoreflect.Message { - mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[9] + mi := &file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1038,7 +1845,7 @@ func (x *SessionRecording) ProtoReflect() protoreflect.Message { // Deprecated: Use SessionRecording.ProtoReflect.Descriptor instead. func (*SessionRecording) Descriptor() ([]byte, []int) { - return file_controller_api_resources_sessionrecordings_v1_session_recording_proto_rawDescGZIP(), []int{9} + return file_controller_api_resources_sessionrecordings_v1_session_recording_proto_rawDescGZIP(), []int{18} } func (x *SessionRecording) GetId() string { @@ -1342,89 +2149,234 @@ var file_controller_api_resources_sessionrecordings_v1_session_recording_proto_r 0x0a, 0x13, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, - 0x22, 0xef, 0x01, 0x0a, 0x0c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x41, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x12, 0x47, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x33, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x73, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x63, - 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x47, 0x0a, 0x04, 0x68, 0x6f, 0x73, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x73, 0x2e, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x04, 0x68, 0x6f, - 0x73, 0x74, 0x22, 0xbe, 0x07, 0x0a, 0x10, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x43, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x6f, 0x70, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x0a, - 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x12, 0x2c, 0x0a, 0x11, - 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x5f, 0x75, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x5f, 0x75, 0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, - 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x3e, 0x0a, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x64, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x0f, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x10, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x78, 0x0a, 0x15, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, - 0x64, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x63, 0x6f, + 0x22, 0xcb, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, + 0x74, 0x6f, 0x72, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5f, 0x69, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x61, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x22, 0xd2, + 0x01, 0x0a, 0x1e, 0x56, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x74, 0x6c, 0x73, + 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x74, 0x6c, + 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x24, 0x0a, + 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x22, 0xb2, 0x02, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x6a, 0x0a, 0x10, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x72, + 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x10, 0x63, 0x72, + 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x48, 0x00, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x42, + 0x07, 0x0a, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x22, 0x67, 0x0a, 0x24, 0x55, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x43, 0x72, 0x65, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, + 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, + 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x68, 0x6d, 0x61, 0x63, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x48, 0x6d, 0x61, + 0x63, 0x22, 0xa8, 0x01, 0x0a, 0x21, 0x53, 0x73, 0x68, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x4b, 0x65, 0x79, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x41, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x6b, + 0x65, 0x79, 0x5f, 0x68, 0x6d, 0x61, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x48, 0x6d, 0x61, 0x63, 0x12, 0x3d, 0x0a, + 0x1b, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x70, 0x61, 0x73, + 0x73, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x5f, 0x68, 0x6d, 0x61, 0x63, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x18, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x61, + 0x73, 0x73, 0x70, 0x68, 0x72, 0x61, 0x73, 0x65, 0x48, 0x6d, 0x61, 0x63, 0x22, 0x3b, 0x0a, 0x18, + 0x4a, 0x73, 0x6f, 0x6e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x41, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x5f, 0x68, 0x6d, 0x61, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x6d, 0x61, 0x63, 0x22, 0xb9, 0x02, 0x0a, 0x11, 0x43, 0x72, + 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x6a, 0x0a, 0x10, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x2e, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x63, 0x6f, + 0x72, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x10, 0x63, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x73, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x73, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x48, 0x00, + 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x42, 0x07, 0x0a, 0x05, + 0x61, 0x74, 0x74, 0x72, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x20, 0x56, 0x61, 0x75, 0x6c, 0x74, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, + 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, + 0x0a, 0x0b, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x68, 0x74, 0x74, 0x70, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, + 0x2a, 0x0a, 0x11, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, + 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x68, 0x74, 0x74, 0x70, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0xdb, 0x04, 0x0a, 0x2e, + 0x56, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x53, 0x48, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x4c, 0x69, 0x62, + 0x72, 0x61, 0x72, 0x79, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6b, 0x65, 0x79, + 0x5f, 0x62, 0x69, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x6b, 0x65, 0x79, + 0x42, 0x69, 0x74, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x9d, 0x01, 0x0a, 0x10, 0x63, 0x72, 0x69, 0x74, 0x69, + 0x63, 0x61, 0x6c, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x73, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x76, + 0x31, 0x2e, 0x56, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x53, 0x48, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x4c, + 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, + 0x2e, 0x43, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8d, 0x01, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x72, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x52, - 0x15, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x63, 0x6f, - 0x72, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x6b, 0x0a, 0x12, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x73, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2e, - 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x41, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x52, - 0x12, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, - 0x64, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x12, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x42, 0x66, 0x5a, 0x64, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x61, 0x72, 0x79, 0x2f, 0x73, 0x64, 0x6b, 0x2f, 0x70, 0x62, 0x73, 0x2f, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x3b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x75, 0x6c, + 0x74, 0x53, 0x53, 0x48, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, + 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x42, 0x0a, 0x14, 0x43, 0x72, 0x69, 0x74, 0x69, 0x63, + 0x61, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3d, 0x0a, 0x0f, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc2, 0x03, 0x0a, 0x0c, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x41, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x04, 0x75, 0x73, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x2e, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x63, 0x6f, 0x72, + 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, + 0x73, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x73, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x73, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x12, 0x47, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x33, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x73, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x0b, 0x63, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x39, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x73, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x0b, 0x63, 0x72, 0x65, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x74, 0x0a, 0x14, 0x63, 0x72, 0x65, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x2e, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, + 0x6e, 0x67, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, + 0x6c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x52, 0x14, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x22, 0xbe, + 0x07, 0x0a, 0x10, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, + 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x43, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, + 0x75, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, + 0x75, 0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x64, 0x6f, 0x77, 0x6e, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x64, 0x6f, + 0x77, 0x6e, 0x12, 0x3e, 0x0a, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x36, + 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x65, 0x6e, + 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1e, 0x0a, 0x0a, + 0x6d, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0a, 0x6d, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, + 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x78, 0x0a, 0x15, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, + 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x2e, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, + 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x15, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, + 0x67, 0x73, 0x12, 0x6b, 0x0a, 0x12, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x41, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x12, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, + 0x2e, 0x0a, 0x12, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x61, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, + 0x66, 0x5a, 0x64, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, + 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, + 0x2f, 0x73, 0x64, 0x6b, 0x2f, 0x70, 0x62, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x6c, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x2f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, + 0x69, 0x6e, 0x67, 0x73, 0x3b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x63, + 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1439,58 +2391,78 @@ func file_controller_api_resources_sessionrecordings_v1_session_recording_proto_ return file_controller_api_resources_sessionrecordings_v1_session_recording_proto_rawDescData } -var file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes = make([]protoimpl.MessageInfo, 10) +var file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes = make([]protoimpl.MessageInfo, 21) var file_controller_api_resources_sessionrecordings_v1_session_recording_proto_goTypes = []interface{}{ - (*ChannelRecording)(nil), // 0: controller.api.resources.sessionrecordings.v1.ChannelRecording - (*ConnectionRecording)(nil), // 1: controller.api.resources.sessionrecordings.v1.ConnectionRecording - (*User)(nil), // 2: controller.api.resources.sessionrecordings.v1.User - (*HostCatalog)(nil), // 3: controller.api.resources.sessionrecordings.v1.HostCatalog - (*Host)(nil), // 4: controller.api.resources.sessionrecordings.v1.Host - (*StaticHostAttributes)(nil), // 5: controller.api.resources.sessionrecordings.v1.StaticHostAttributes - (*Target)(nil), // 6: controller.api.resources.sessionrecordings.v1.Target - (*SshTargetAttributes)(nil), // 7: controller.api.resources.sessionrecordings.v1.SshTargetAttributes - (*ValuesAtTime)(nil), // 8: controller.api.resources.sessionrecordings.v1.ValuesAtTime - (*SessionRecording)(nil), // 9: controller.api.resources.sessionrecordings.v1.SessionRecording - (*timestamppb.Timestamp)(nil), // 10: google.protobuf.Timestamp - (*durationpb.Duration)(nil), // 11: google.protobuf.Duration - (*scopes.ScopeInfo)(nil), // 12: controller.api.resources.scopes.v1.ScopeInfo - (*structpb.Struct)(nil), // 13: google.protobuf.Struct + (*ChannelRecording)(nil), // 0: controller.api.resources.sessionrecordings.v1.ChannelRecording + (*ConnectionRecording)(nil), // 1: controller.api.resources.sessionrecordings.v1.ConnectionRecording + (*User)(nil), // 2: controller.api.resources.sessionrecordings.v1.User + (*HostCatalog)(nil), // 3: controller.api.resources.sessionrecordings.v1.HostCatalog + (*Host)(nil), // 4: controller.api.resources.sessionrecordings.v1.Host + (*StaticHostAttributes)(nil), // 5: controller.api.resources.sessionrecordings.v1.StaticHostAttributes + (*Target)(nil), // 6: controller.api.resources.sessionrecordings.v1.Target + (*SshTargetAttributes)(nil), // 7: controller.api.resources.sessionrecordings.v1.SshTargetAttributes + (*CredentialStore)(nil), // 8: controller.api.resources.sessionrecordings.v1.CredentialStore + (*VaultCredentialStoreAttributes)(nil), // 9: controller.api.resources.sessionrecordings.v1.VaultCredentialStoreAttributes + (*Credential)(nil), // 10: controller.api.resources.sessionrecordings.v1.Credential + (*UsernamePasswordCredentialAttributes)(nil), // 11: controller.api.resources.sessionrecordings.v1.UsernamePasswordCredentialAttributes + (*SshPrivateKeyCredentialAttributes)(nil), // 12: controller.api.resources.sessionrecordings.v1.SshPrivateKeyCredentialAttributes + (*JsonCredentialAttributes)(nil), // 13: controller.api.resources.sessionrecordings.v1.JsonCredentialAttributes + (*CredentialLibrary)(nil), // 14: controller.api.resources.sessionrecordings.v1.CredentialLibrary + (*VaultCredentialLibraryAttributes)(nil), // 15: controller.api.resources.sessionrecordings.v1.VaultCredentialLibraryAttributes + (*VaultSSHCertificateCredentialLibraryAttributes)(nil), // 16: controller.api.resources.sessionrecordings.v1.VaultSSHCertificateCredentialLibraryAttributes + (*ValuesAtTime)(nil), // 17: controller.api.resources.sessionrecordings.v1.ValuesAtTime + (*SessionRecording)(nil), // 18: controller.api.resources.sessionrecordings.v1.SessionRecording + nil, // 19: controller.api.resources.sessionrecordings.v1.VaultSSHCertificateCredentialLibraryAttributes.CriticalOptionsEntry + nil, // 20: controller.api.resources.sessionrecordings.v1.VaultSSHCertificateCredentialLibraryAttributes.ExtensionsEntry + (*timestamppb.Timestamp)(nil), // 21: google.protobuf.Timestamp + (*durationpb.Duration)(nil), // 22: google.protobuf.Duration + (*scopes.ScopeInfo)(nil), // 23: controller.api.resources.scopes.v1.ScopeInfo + (*structpb.Struct)(nil), // 24: google.protobuf.Struct } var file_controller_api_resources_sessionrecordings_v1_session_recording_proto_depIdxs = []int32{ - 10, // 0: controller.api.resources.sessionrecordings.v1.ChannelRecording.created_time:type_name -> google.protobuf.Timestamp - 10, // 1: controller.api.resources.sessionrecordings.v1.ChannelRecording.updated_time:type_name -> google.protobuf.Timestamp - 10, // 2: controller.api.resources.sessionrecordings.v1.ChannelRecording.start_time:type_name -> google.protobuf.Timestamp - 10, // 3: controller.api.resources.sessionrecordings.v1.ChannelRecording.end_time:type_name -> google.protobuf.Timestamp - 11, // 4: controller.api.resources.sessionrecordings.v1.ChannelRecording.duration:type_name -> google.protobuf.Duration - 10, // 5: controller.api.resources.sessionrecordings.v1.ConnectionRecording.created_time:type_name -> google.protobuf.Timestamp - 10, // 6: controller.api.resources.sessionrecordings.v1.ConnectionRecording.updated_time:type_name -> google.protobuf.Timestamp - 10, // 7: controller.api.resources.sessionrecordings.v1.ConnectionRecording.start_time:type_name -> google.protobuf.Timestamp - 10, // 8: controller.api.resources.sessionrecordings.v1.ConnectionRecording.end_time:type_name -> google.protobuf.Timestamp - 11, // 9: controller.api.resources.sessionrecordings.v1.ConnectionRecording.duration:type_name -> google.protobuf.Duration + 21, // 0: controller.api.resources.sessionrecordings.v1.ChannelRecording.created_time:type_name -> google.protobuf.Timestamp + 21, // 1: controller.api.resources.sessionrecordings.v1.ChannelRecording.updated_time:type_name -> google.protobuf.Timestamp + 21, // 2: controller.api.resources.sessionrecordings.v1.ChannelRecording.start_time:type_name -> google.protobuf.Timestamp + 21, // 3: controller.api.resources.sessionrecordings.v1.ChannelRecording.end_time:type_name -> google.protobuf.Timestamp + 22, // 4: controller.api.resources.sessionrecordings.v1.ChannelRecording.duration:type_name -> google.protobuf.Duration + 21, // 5: controller.api.resources.sessionrecordings.v1.ConnectionRecording.created_time:type_name -> google.protobuf.Timestamp + 21, // 6: controller.api.resources.sessionrecordings.v1.ConnectionRecording.updated_time:type_name -> google.protobuf.Timestamp + 21, // 7: controller.api.resources.sessionrecordings.v1.ConnectionRecording.start_time:type_name -> google.protobuf.Timestamp + 21, // 8: controller.api.resources.sessionrecordings.v1.ConnectionRecording.end_time:type_name -> google.protobuf.Timestamp + 22, // 9: controller.api.resources.sessionrecordings.v1.ConnectionRecording.duration:type_name -> google.protobuf.Duration 0, // 10: controller.api.resources.sessionrecordings.v1.ConnectionRecording.channel_recordings:type_name -> controller.api.resources.sessionrecordings.v1.ChannelRecording - 12, // 11: controller.api.resources.sessionrecordings.v1.User.scope:type_name -> controller.api.resources.scopes.v1.ScopeInfo - 12, // 12: controller.api.resources.sessionrecordings.v1.HostCatalog.scope:type_name -> controller.api.resources.scopes.v1.ScopeInfo - 13, // 13: controller.api.resources.sessionrecordings.v1.HostCatalog.attributes:type_name -> google.protobuf.Struct + 23, // 11: controller.api.resources.sessionrecordings.v1.User.scope:type_name -> controller.api.resources.scopes.v1.ScopeInfo + 23, // 12: controller.api.resources.sessionrecordings.v1.HostCatalog.scope:type_name -> controller.api.resources.scopes.v1.ScopeInfo + 24, // 13: controller.api.resources.sessionrecordings.v1.HostCatalog.attributes:type_name -> google.protobuf.Struct 3, // 14: controller.api.resources.sessionrecordings.v1.Host.host_catalog:type_name -> controller.api.resources.sessionrecordings.v1.HostCatalog - 13, // 15: controller.api.resources.sessionrecordings.v1.Host.attributes:type_name -> google.protobuf.Struct - 12, // 16: controller.api.resources.sessionrecordings.v1.Target.scope:type_name -> controller.api.resources.scopes.v1.ScopeInfo - 13, // 17: controller.api.resources.sessionrecordings.v1.Target.attributes:type_name -> google.protobuf.Struct - 2, // 18: controller.api.resources.sessionrecordings.v1.ValuesAtTime.user:type_name -> controller.api.resources.sessionrecordings.v1.User - 6, // 19: controller.api.resources.sessionrecordings.v1.ValuesAtTime.target:type_name -> controller.api.resources.sessionrecordings.v1.Target - 4, // 20: controller.api.resources.sessionrecordings.v1.ValuesAtTime.host:type_name -> controller.api.resources.sessionrecordings.v1.Host - 12, // 21: controller.api.resources.sessionrecordings.v1.SessionRecording.scope:type_name -> controller.api.resources.scopes.v1.ScopeInfo - 10, // 22: controller.api.resources.sessionrecordings.v1.SessionRecording.created_time:type_name -> google.protobuf.Timestamp - 10, // 23: controller.api.resources.sessionrecordings.v1.SessionRecording.updated_time:type_name -> google.protobuf.Timestamp - 10, // 24: controller.api.resources.sessionrecordings.v1.SessionRecording.start_time:type_name -> google.protobuf.Timestamp - 10, // 25: controller.api.resources.sessionrecordings.v1.SessionRecording.end_time:type_name -> google.protobuf.Timestamp - 11, // 26: controller.api.resources.sessionrecordings.v1.SessionRecording.duration:type_name -> google.protobuf.Duration - 1, // 27: controller.api.resources.sessionrecordings.v1.SessionRecording.connection_recordings:type_name -> controller.api.resources.sessionrecordings.v1.ConnectionRecording - 8, // 28: controller.api.resources.sessionrecordings.v1.SessionRecording.create_time_values:type_name -> controller.api.resources.sessionrecordings.v1.ValuesAtTime - 29, // [29:29] is the sub-list for method output_type - 29, // [29:29] is the sub-list for method input_type - 29, // [29:29] is the sub-list for extension type_name - 29, // [29:29] is the sub-list for extension extendee - 0, // [0:29] is the sub-list for field type_name + 24, // 15: controller.api.resources.sessionrecordings.v1.Host.attributes:type_name -> google.protobuf.Struct + 23, // 16: controller.api.resources.sessionrecordings.v1.Target.scope:type_name -> controller.api.resources.scopes.v1.ScopeInfo + 24, // 17: controller.api.resources.sessionrecordings.v1.Target.attributes:type_name -> google.protobuf.Struct + 24, // 18: controller.api.resources.sessionrecordings.v1.CredentialStore.attributes:type_name -> google.protobuf.Struct + 8, // 19: controller.api.resources.sessionrecordings.v1.Credential.credential_store:type_name -> controller.api.resources.sessionrecordings.v1.CredentialStore + 24, // 20: controller.api.resources.sessionrecordings.v1.Credential.attributes:type_name -> google.protobuf.Struct + 8, // 21: controller.api.resources.sessionrecordings.v1.CredentialLibrary.credential_store:type_name -> controller.api.resources.sessionrecordings.v1.CredentialStore + 24, // 22: controller.api.resources.sessionrecordings.v1.CredentialLibrary.attributes:type_name -> google.protobuf.Struct + 19, // 23: controller.api.resources.sessionrecordings.v1.VaultSSHCertificateCredentialLibraryAttributes.critical_options:type_name -> controller.api.resources.sessionrecordings.v1.VaultSSHCertificateCredentialLibraryAttributes.CriticalOptionsEntry + 20, // 24: controller.api.resources.sessionrecordings.v1.VaultSSHCertificateCredentialLibraryAttributes.extensions:type_name -> controller.api.resources.sessionrecordings.v1.VaultSSHCertificateCredentialLibraryAttributes.ExtensionsEntry + 2, // 25: controller.api.resources.sessionrecordings.v1.ValuesAtTime.user:type_name -> controller.api.resources.sessionrecordings.v1.User + 6, // 26: controller.api.resources.sessionrecordings.v1.ValuesAtTime.target:type_name -> controller.api.resources.sessionrecordings.v1.Target + 4, // 27: controller.api.resources.sessionrecordings.v1.ValuesAtTime.host:type_name -> controller.api.resources.sessionrecordings.v1.Host + 10, // 28: controller.api.resources.sessionrecordings.v1.ValuesAtTime.credentials:type_name -> controller.api.resources.sessionrecordings.v1.Credential + 14, // 29: controller.api.resources.sessionrecordings.v1.ValuesAtTime.credential_libraries:type_name -> controller.api.resources.sessionrecordings.v1.CredentialLibrary + 23, // 30: controller.api.resources.sessionrecordings.v1.SessionRecording.scope:type_name -> controller.api.resources.scopes.v1.ScopeInfo + 21, // 31: controller.api.resources.sessionrecordings.v1.SessionRecording.created_time:type_name -> google.protobuf.Timestamp + 21, // 32: controller.api.resources.sessionrecordings.v1.SessionRecording.updated_time:type_name -> google.protobuf.Timestamp + 21, // 33: controller.api.resources.sessionrecordings.v1.SessionRecording.start_time:type_name -> google.protobuf.Timestamp + 21, // 34: controller.api.resources.sessionrecordings.v1.SessionRecording.end_time:type_name -> google.protobuf.Timestamp + 22, // 35: controller.api.resources.sessionrecordings.v1.SessionRecording.duration:type_name -> google.protobuf.Duration + 1, // 36: controller.api.resources.sessionrecordings.v1.SessionRecording.connection_recordings:type_name -> controller.api.resources.sessionrecordings.v1.ConnectionRecording + 17, // 37: controller.api.resources.sessionrecordings.v1.SessionRecording.create_time_values:type_name -> controller.api.resources.sessionrecordings.v1.ValuesAtTime + 38, // [38:38] is the sub-list for method output_type + 38, // [38:38] is the sub-list for method input_type + 38, // [38:38] is the sub-list for extension type_name + 38, // [38:38] is the sub-list for extension extendee + 0, // [0:38] is the sub-list for field type_name } func init() { file_controller_api_resources_sessionrecordings_v1_session_recording_proto_init() } @@ -1596,7 +2568,7 @@ func file_controller_api_resources_sessionrecordings_v1_session_recording_proto_ } } file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValuesAtTime); i { + switch v := v.(*CredentialStore); i { case 0: return &v.state case 1: @@ -1608,6 +2580,114 @@ func file_controller_api_resources_sessionrecordings_v1_session_recording_proto_ } } file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*VaultCredentialStoreAttributes); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Credential); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UsernamePasswordCredentialAttributes); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SshPrivateKeyCredentialAttributes); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*JsonCredentialAttributes); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CredentialLibrary); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*VaultCredentialLibraryAttributes); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*VaultSSHCertificateCredentialLibraryAttributes); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValuesAtTime); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SessionRecording); i { case 0: return &v.state @@ -1629,13 +2709,22 @@ func file_controller_api_resources_sessionrecordings_v1_session_recording_proto_ file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[6].OneofWrappers = []interface{}{ (*Target_Attributes)(nil), } + file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[8].OneofWrappers = []interface{}{ + (*CredentialStore_Attributes)(nil), + } + file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[10].OneofWrappers = []interface{}{ + (*Credential_Attributes)(nil), + } + file_controller_api_resources_sessionrecordings_v1_session_recording_proto_msgTypes[14].OneofWrappers = []interface{}{ + (*CredentialLibrary_Attributes)(nil), + } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_controller_api_resources_sessionrecordings_v1_session_recording_proto_rawDesc, NumEnums: 0, - NumMessages: 10, + NumMessages: 21, NumExtensions: 0, NumServices: 0, },