chore(API): Update the API definitions for RDP (#6758)

This commit is contained in:
Ryan Derr authored and GitHub committed 2026-07-08 16:42:34 +05:30
1 parent b495fe653b
commit 6f03523372
30 files changed
+4189 -268

No files matched your search

@@ -44,6 +44,29 @@ message ChannelRecording {
// MimeTypes define the mime types that can
// be used to consume the recording of this Channel.
// The only supported mime type is "application/x-asciicast".
// Deprecated: This field has been moved to SSH-specific attributes and will be removed
// entirely in a future Boundary version.
repeated string mime_types = 9 [
json_name = "mime_types",
deprecated = true
]; // @gotags: class:"public" eventstream:"observation"
// The detailed state of the channel recording.
RecordingState recording_state = 23 [json_name = "recording_state"]; // @gotags: class:"public" eventstream:"observation"
oneof attrs {
// The attributes that are applicable for the specific Channel Recording type.
google.protobuf.Struct attributes = 10 [(custom_options.v1.subtype) = "default"];
SshChannelRecording ssh_channel_recording = 11 [
(google.api.field_visibility).restriction = "INTERNAL",
(custom_options.v1.subtype) = "ssh_channel_recording"
];
}
}
// SshChannelRecording contains SSH-specific attributes for a channel recording.
message SshChannelRecording {
repeated string mime_types = 9 [json_name = "mime_types"]; // @gotags: class:"public" eventstream:"observation"
}
@@ -83,6 +106,17 @@ message ConnectionRecording {
// Optionally, the channels used in this Connection,
// if it is using a multiplexed protocol, such as SSH.
repeated ChannelRecording channel_recordings = 10 [json_name = "channel_recordings"];
// The detailed state of the connection recording.
RecordingState recording_state = 11 [json_name = "recording_state"]; // @gotags: class:"public" eventstream:"observation"
// Optionally, exports that may have been created for this Connection
// Recording.
repeated Export exports = 12 [json_name = "exports"]; // @gotags: class:"public"
// Optionally, videos that may have been recorded for this Connection
// Recording.
repeated Video videos = 13 [json_name = "videos"]; // @gotags: class:"public"
}
// User describes an authenticated user in Boundary.
@@ -216,6 +250,10 @@ message Target {
(google.api.field_visibility).restriction = "INTERNAL",
(custom_options.v1.subtype) = "ssh"
];
RdpTargetAttributes rdp_target_attributes = 13 [
(google.api.field_visibility).restriction = "INTERNAL",
(custom_options.v1.subtype) = "rdp"
];
}
}
@@ -228,6 +266,15 @@ message SshTargetAttributes {
uint32 default_client_port = 2 [json_name = "default_client_port"]; // @gotags: class:"public"
}
// RdpTargetAttributes contains attributes relevant to Targets of type "rdp"
message RdpTargetAttributes {
// The default RDP port used when connecting to the endpoint.
uint32 default_port = 1 [json_name = "default_port"]; // @gotags: class:"public"
// The default TCP port listened on by the client's local proxy.
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.
@@ -312,6 +359,10 @@ message Credential {
(google.api.field_visibility).restriction = "INTERNAL",
(custom_options.v1.subtype) = "password"
];
UsernamePasswordDomainCredentialAttributes username_password_domain_attributes = 12 [
(google.api.field_visibility).restriction = "INTERNAL",
(custom_options.v1.subtype) = "username_password_domain"
];
}
}
@@ -324,6 +375,18 @@ message UsernamePasswordCredentialAttributes {
string password_hmac = 2; // @gotags: class:"public"
}
// The attributes of a UsernamePasswordDomain Credential.
message UsernamePasswordDomainCredentialAttributes {
// The username associated with the credential.
string username = 1; // @gotags: class:"sensitive"
// The hmac value of the password.
string password_hmac = 2; // @gotags: class:"public"
// The domain associated with the credential.
string domain = 3; // @gotags: class:"public"
}
// The attributes of a SshPrivateKey Credential.
message SshPrivateKeyCredentialAttributes {
// The username associated with the credential.
@@ -383,6 +446,10 @@ message CredentialLibrary {
(google.api.field_visibility).restriction = "INTERNAL",
(custom_options.v1.subtype) = "vault-ssh-certificate"
];
VaultLdapCredentialLibraryAttributes vault_ldap_credential_library_attributes = 11 [
(google.api.field_visibility).restriction = "INTERNAL",
(custom_options.v1.subtype) = "vault-ldap"
];
}
}
@@ -398,6 +465,12 @@ message VaultCredentialLibraryAttributes {
string http_request_body = 3; // @gotags: `class:"secret"`
}
// The attributes of a Vault typed LDAP Credential Library.
message VaultLdapCredentialLibraryAttributes {
// The path in Vault to request credentials from.
string path = 1; // @gotags: class:"public"
}
// The attributes of a vault SSH Certificate Credential Library.
message VaultSSHCertificateCredentialLibraryAttributes {
// The path in Vault to request credentials from.
@@ -444,6 +517,59 @@ message ValuesAtTime {
repeated CredentialLibrary credential_libraries = 5 [json_name = "credential_libraries"];
}
// RecordingState contain information about the state of a recording.
message RecordingState {
// Information about the storage state of the recording.
string storage_state = 1; // @gotags: class:"public"
// Information about the syncing error details of the recording.
string syncing_error_details = 2; // @gotags: class:"public"
// Information about the verification error details of the recording.
string verification_error_details = 3; // @gotags: class:"public"
}
// Export contains information about the export of a session recording.
message Export {
// The ID of the Export.
string id = 10; // @gotags: class:"public"
// The scope that the Export is in. This is inferred from the storage bucket
// associated with the session recording.
resources.scopes.v1.ScopeInfo scope = 20; // @gotags: class:"public"
// The mime type of the Export.
string mime_type = 30; // @gotags: class:"public" eventstream:"observation"
// The current state of the Export.
string state = 40; // @gotags: class:"public" eventstream:"observation"
// The export's current progress.
uint32 progress_percent = 50; // @gotags: class:"public" eventstream:"observation"
// The ID of the worker processing the Export.
string worker_id = 60; // @gotags: class:"public" eventstream:"observation"
// The time the Export was created.
google.protobuf.Timestamp created_time = 70; // @gotags: class:"public" eventstream:"observation"
// The time of the most recent update to the Export.
google.protobuf.Timestamp updated_time = 80; // @gotags: class:"public" eventstream:"observation"
// The version of the Export.
uint32 version = 90; // @gotags: `class:"public"`
// The ID of the Connection Recording being exported.
string connection_recording_id = 100; // @gotags: class:"public" eventstream:"observation"
// Any error encountered during the Export, if the Export failed.
string error = 110; // @gotags: class:"public"
// The available actions on this resource for this user.
repeated string authorized_actions = 300 [json_name = "authorized_actions"]; // @gotags: class:"public"
}
// Video contains information about the video recording of a Session Recording.
message Video {
// The ID of the Video.
string id = 10; // @gotags: class:"public"
// The time the Video was created.
google.protobuf.Timestamp created_time = 20; // @gotags: class:"public" eventstream:"observation"
// The duration of the Video in seconds.
uint64 length_seconds = 30; // @gotags: class:"public" eventstream:"observation"
// The size of the Video in bytes.
uint64 size_bytes = 40; // @gotags: class:"public" eventstream:"observation"
}
// SessionRecording contains information about the recording of a Session.
message SessionRecording {
// The ID of the Session recording.
@@ -490,10 +616,16 @@ message SessionRecording {
// The current state of the session recording. One of
// "started", "available" and "unknown".
//
// Note: this field will eventually be deprecated two release after 1.0.0
// in favor of the availability field.
string state = 13; // @gotags: class:"public" eventstream:"observation"
// Any error seen during the closing of the session recording.
// Currently only set if state is "unknown".
//
// Note: this field will eventually be deprecated two release after 1.0.0
// in favor of the error details contained in the recording_state field.
string error_details = 14; // @gotags: class:"public"
// MimeTypes define the mime types that can
@@ -520,4 +652,10 @@ message SessionRecording {
// The time a session recording is scheduled to be automatically deleted.
google.protobuf.Timestamp delete_after = 21 [json_name = "delete_after"]; // @gotags: class:"public" eventstream:"observation"
// The availability of the session recording. One of "available" or "not available".
string availability = 22 [json_name = "availability"]; // @gotags: class:"public" eventstream:"observation"
// The detailed state of the session recording.
RecordingState recording_state = 23 [json_name = "recording_state"]; // @gotags: class:"public" eventstream:"observation"
}
@@ -350,6 +350,26 @@ message RdpTargetAttributes {
that: "DefaultClientPort"
}
]; // @gotags: `class:"public"`
// PublicId of the storage bucket associated with the target
google.protobuf.StringValue storage_bucket_id = 30 [
json_name = "storage_bucket_id",
(custom_options.v1.generate_sdk_option) = true,
(custom_options.v1.mask_mapping) = {
this: "attributes.storage_bucket_id"
that: "StorageBucketId"
}
]; // @gotags: `class:"public" eventstream:"observation"`
// A boolean indicating if session recording has been enabled
google.protobuf.BoolValue enable_session_recording = 40 [
json_name = "enable_session_recording",
(custom_options.v1.generate_sdk_option) = true,
(custom_options.v1.mask_mapping) = {
this: "attributes.enable_session_recording"
that: "EnableSessionRecording"
}
]; // @gotags: `class:"public" eventstream:"observation"`
}
// WorkerInfo contains information about workers, returned in to the client in SessionAuthorization
@@ -20,8 +20,8 @@ service SessionRecordingService {
"It provides an audit trail of user activity and lets administrators monitor access. "
"The session recording service provides endpoints that let you manage session recordings in Boundary."
external_docs: {
url: "https://developer.hashicorp.com/boundary/docs/concepts/domain-model/session-recordings";
description: "Read about session recordings in the Boundary domain model";
url: "https://developer.hashicorp.com/boundary/docs/concepts/domain-model/session-recordings"
description: "Read about session recordings in the Boundary domain model"
}
};
@@ -48,10 +48,11 @@ service SessionRecordingService {
// Supports both Session ID and Session recording ID for looking up a Session recording.
// Supports both Connection ID and Connection recording ID to look up a Connection recording.
// A Channel recording ID is required to look up a Channel recording.
// The only supported mime type is "application/x-asciicast".
// A Video ID is required to look up a Video recording.
// Supported mime types: "application/x-asciicast", "video/webm"
rpc Download(DownloadRequest) returns (stream google.api.HttpBody) {
option (google.api.http) = {get: "/v1/session-recordings/{id}:download"};
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {summary: "Download returns the contents of the specified resource in the specified mime type. Supports both Session ID and Session recording ID for looking up a Session recording. Supports both Connection ID and Connection recording ID to look up a Connection recording. A Channel recording ID is required to look up a Channel recording. The only supported mime type is \"application/x-asciicast\"."};
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {summary: "Download returns the contents of the specified resource in the specified mime type. Supports both Session ID and Session recording ID for looking up a Session recording. Supports both Connection ID and Connection recording ID to look up a Connection recording. A Channel recording ID is required to look up a Channel recording. A Video ID is required to look up a Video recording. Supported mime types: \"application/x-asciicast\", \"video/webm\"."};
}
// ReApplyStoragePolicy calculates the resultant set of policy for a given session recording
@@ -66,11 +67,52 @@ service SessionRecordingService {
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {summary: "ReApplyStoragePolicy will recalculate the resultant set of policy and apply the result to the given session recording."};
}
// DeleteSessionRecording removes a Session Recording from Boundary. If the Session Recording id
// is malformed or not provided an error is returned.
// DeleteSessionRecording deletes a Session Recording or Video recording.
// Supports Session Recording ID to delete a Session Recording.
// Supports Video ID to delete a Video recording.
// If the Session Recording id is malformed or not provided an error is returned.
rpc DeleteSessionRecording(DeleteSessionRecordingRequest) returns (DeleteSessionRecordingResponse) {
option (google.api.http) = {delete: "/v1/session-recordings/{id}"};
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {summary: "Deletes a Session Recording"};
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {summary: "Deletes a Session Recording when provided a Session Recording ID, or deletes a Video recording when provided a Video ID. If the ID is malformed or not provided an error is returned."};
}
// CreateExport creates an export of the specified Connection Recording in the requested mime type.
// The provided request must include the Connection Recording ID. The export is processed
// asynchronously; use GetExport to poll the status of the export. If the ID is missing,
// malformed, or references a non-existing resource, an error is returned.
rpc CreateExport(CreateExportRequest) returns (CreateExportResponse) {
option (google.api.http) = {
post: "/v1/session-recordings/{connection_recording_id}:export"
body: "*"
response_body: "item"
};
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {summary: "CreateExport creates an export of the specified Connection Recording in the requested mime type. The export is processed asynchronously; use GetExport to poll the status of the export. If the ID is missing, malformed, or references a non-existing resource, an error is returned."};
}
// GetExport returns a stored Export if present. The provided request must include the Export ID
// for the Export being retrieved. If that ID is missing, malformed, or references a non-existing
// resource, an error is returned.
rpc GetExport(GetExportRequest) returns (GetExportResponse) {
option (google.api.http) = {
get: "/v1/session-recordings/{id}:export"
response_body: "item"
};
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {summary: "GetExport returns a stored Export if present. The provided request must include the Export ID for the Export being retrieved. If that ID is missing, malformed, or references a non-existing resource, an error is returned."};
}
// ListExports lists all Exports. Exports are ordered by create time descending
// (most recently created first).
rpc ListExports(ListExportsRequest) returns (ListExportsResponse) {
option (google.api.http) = {get: "/v1/session-recordings:list-exports"};
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {summary: "ListExports lists all exports. Exports are ordered by created_time descending (most recently created first)."};
}
// CancelExport cancels an Export that is in progress. The provided request must include the
// Export ID for the Export being cancelled. If that ID is missing, malformed, or references a
// non-existing resource, an error is returned. Returns the Export in its cancelled state.
rpc CancelExport(CancelExportRequest) returns (CancelExportResponse) {
option (google.api.http) = {post: "/v1/session-recordings/{id}:export:cancel"};
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {summary: "CancelExport cancels an Export that is in progress. The provided request must include the Export ID for the Export being cancelled. If that ID is missing, malformed, or references a non-existing resource, an error is returned. Returns the Export in its cancelled state."};
}
}
@@ -134,8 +176,9 @@ message DownloadRequest {
// - Session ID and Session recording ID for Session recordings
// - Connection ID and Connection recording ID for Connection recordings
// - Channel recording ID for Channel recordings
// - Video ID for Video recordings
string id = 1; // @gotags: class:"public" eventstream:"observation"
// The format of the response. The only supported mime type is "application/x-asciicast".
// The format of the response. Supports "application/x-asciicast" and "video/webm".
// Defaults to "application/x-asciicast" if not set.
string mime_type = 2 [json_name = "mime_type"]; // @gotags: class:"public" eventstream:"observation"
}
@@ -155,3 +198,77 @@ message DeleteSessionRecordingRequest {
}
message DeleteSessionRecordingResponse {}
message CreateExportRequest {
// The ID of the Connection Recording to export.
string connection_recording_id = 1; // @gotags: class:"public" eventstream:"observation"
// The mime type of the export.
string mime_type = 2 [json_name = "mime_type"]; // @gotags: class:"public" eventstream:"observation"
}
message CreateExportResponse {
// The created export.
resources.sessionrecordings.v1.Export item = 1;
}
message GetExportRequest {
// The ID of the Export to retrieve.
string id = 1; // @gotags: class:"public" eventstream:"observation"
}
message GetExportResponse {
// The requested export.
resources.sessionrecordings.v1.Export item = 1;
}
message ListExportsRequest {
// The scope in which to list exports.
// Must be set unless recursive is set.
string scope_id = 1; // @gotags: class:"public" eventstream:"observation"
// Whether to recurse into child scopes when listing.
// If set and scope_id is empty, shows exports in
// all scopes the caller has access to.
bool recursive = 2; // @gotags: class:"public" eventstream:"observation"
// An opaque token that Boundary uses to continue an existing iteration or
// request updated items. If you do not specify a token, pagination
// starts from the beginning. To learn more about list pagination
// in Boundary, refer to [list pagination](https://developer.hashicorp.com/boundary/docs/api-clients/api/pagination).
string list_token = 3 [json_name = "list_token"]; // @gotags: `class:"public"`
// The maximum size of a page in this iteration.
// If you do not set a page size, Boundary uses the configured default page size.
// If the page_size is greater than the default page size configured,
// Boundary truncates the page size to this number.
uint32 page_size = 4 [json_name = "page_size"]; // @gotags: class:"public" eventstream:"observation"
}
message ListExportsResponse {
// The items returned in this page.
repeated resources.sessionrecordings.v1.Export items = 1;
// The type of response, either "delta" or "complete".
// Delta signifies that this is part of a paginated result
// or an update to a previously completed pagination.
// Complete signifies that it is the last page.
string response_type = 2 [json_name = "response_type"]; // @gotags: class:"public" eventstream:"observation"
// An opaque token used to continue an existing pagination or
// request updated items. Use this token in the next list request
// to request the next page.
string list_token = 3 [json_name = "list_token"]; // @gotags: `class:"public"`
// The name of the field which the items are sorted by.
string sort_by = 4 [json_name = "sort_by"]; // @gotags: class:"public" eventstream:"observation"
// The direction of the sort, either "asc" or "desc".
string sort_dir = 5 [json_name = "sort_dir"]; // @gotags: class:"public" eventstream:"observation"
// A list of item IDs that have been removed since they were returned
// as part of a pagination. They should be dropped from any client cache.
// This may contain items that are not known to the cache, if they were
// created and deleted between listings.
repeated string removed_ids = 6 [json_name = "removed_ids"]; // @gotags: class:"public" eventstream:"observation"
// An estimate at the total items available. This may change during pagination.
uint32 est_item_count = 7 [json_name = "est_item_count"]; // @gotags: class:"public" eventstream:"observation"
}
message CancelExportRequest {
// The ID of the Export to cancel.
string id = 1; // @gotags: class:"public" eventstream:"observation"
}
message CancelExportResponse {}