From e9b3724b1990a0cff83cd51a8e922b6a3bdf30a7 Mon Sep 17 00:00:00 2001 From: Grzegorz Zdunek Date: Fri, 9 May 2025 13:04:44 +0200 Subject: [PATCH 01/14] Register directory access when starting a desktop session --- lib/teleterm/daemon/daemon.go | 25 +++++--- .../services/desktop/directorysharing.go | 61 +++++++++++++++++++ .../services/desktop/directorysharing_test.go | 44 +++++++++++++ 3 files changed, 122 insertions(+), 8 deletions(-) diff --git a/lib/teleterm/daemon/daemon.go b/lib/teleterm/daemon/daemon.go index d69da32ea305c..53fa33b025572 100644 --- a/lib/teleterm/daemon/daemon.go +++ b/lib/teleterm/daemon/daemon.go @@ -84,13 +84,14 @@ func New(cfg Config) (*Service, error) { go connectUsageReporter.Run(closeContext) service := &Service{ - cfg: &cfg, - closeContext: closeContext, - cancel: cancel, - gateways: make(map[string]gateway.Gateway), - usageReporter: connectUsageReporter, - headlessWatcherClosers: make(map[string]context.CancelFunc), - headlessAuthSemaphore: newWaitSemaphore(maxConcurrentImportantModals, imporantModalWaitDuraiton), + cfg: &cfg, + closeContext: closeContext, + cancel: cancel, + gateways: make(map[string]gateway.Gateway), + usageReporter: connectUsageReporter, + headlessWatcherClosers: make(map[string]context.CancelFunc), + headlessAuthSemaphore: newWaitSemaphore(maxConcurrentImportantModals, imporantModalWaitDuraiton), + desktopDirectorySharingManager: desktop.NewDirectorySharingManager(), } // TODO(gzdunek): The client cache should be created outside of daemon.New. @@ -222,8 +223,14 @@ func (s *Service) ConnectToDesktop(stream grpc.BidiStreamingServer[api.ConnectTo return trace.Wrap(err) } + dir, unregister, err := s.desktopDirectorySharingManager.Register(desktop.TargetSession{DesktopURI: uri, Login: login}) + if err != nil { + return trace.Wrap(err) + } + defer unregister() + err = clusters.AddMetadataToRetryableError(ctx, func() error { - return trace.Wrap(desktop.Connect(ctx, stream, clusterClient, cachedClient.ProxyClient, desktopName, login)) + return trace.Wrap(desktop.Connect(ctx, stream, clusterClient, cachedClient.ProxyClient, desktopName, login, dir)) }) return trace.Wrap(err) } @@ -1278,6 +1285,8 @@ type Service struct { headlessWatcherClosers map[string]context.CancelFunc headlessWatcherClosersMu sync.Mutex clientCache ClientCache + + desktopDirectorySharingManager *desktop.DirectorySharingManager } type CreateGatewayParams struct { diff --git a/lib/teleterm/services/desktop/directorysharing.go b/lib/teleterm/services/desktop/directorysharing.go index 4daaed5f36988..1cb3153e2e52b 100644 --- a/lib/teleterm/services/desktop/directorysharing.go +++ b/lib/teleterm/services/desktop/directorysharing.go @@ -23,10 +23,71 @@ import ( "os" "path/filepath" "strings" + "sync" "github.com/gravitational/trace" + + "github.com/gravitational/teleport/lib/teleterm/api/uri" ) +// DirectorySharingManager coordinates access to shared directories across multiple desktop sessions. +type DirectorySharingManager struct { + directories map[TargetSession]*DirectoryAccess + mu sync.Mutex +} + +// NewDirectorySharingManager initializes DirectorySharingManager. +func NewDirectorySharingManager() *DirectorySharingManager { + return &DirectorySharingManager{ + directories: make(map[TargetSession]*DirectoryAccess), + } +} + +// TargetSession uniquely describes a desktop session. +// There can be only one session for the given desktop and login pair. +type TargetSession struct { + DesktopURI uri.ResourceURI + Login string +} + +// Register initializes shared directory access for given desktop session. +// When the session ends, it should unregister the directory access for it. +// Registering dir access for the same session without unregistering it first, is not allowed. +func (g *DirectorySharingManager) Register(session TargetSession) (access *DirectoryAccess, unregister func(), err error) { + g.mu.Lock() + defer g.mu.Unlock() + + access, ok := g.directories[session] + if ok { + return nil, nil, trace.AlreadyExists("directory access for %v is already registered", session) + } + access = &DirectoryAccess{} + g.directories[session] = access + + unregister = func() { + g.mu.Lock() + defer g.mu.Unlock() + + delete(g.directories, session) + } + + return access, unregister, nil +} + +// Get returns the directory access for the given session. +// It must be registered by the desktop session first. +func (g *DirectorySharingManager) Get(target TargetSession) (*DirectoryAccess, error) { + g.mu.Lock() + defer g.mu.Unlock() + + manager, ok := g.directories[target] + if !ok { + return nil, trace.NotFound("directory sharing has not been initialized for desktop %q and login %q", target.DesktopURI, target.Login) + } + + return manager, nil +} + // DirectoryAccess enables file system operations for a given directory. // Should be kept in sync with web/packages/shared/libs/tdp/sharedDirectoryAccess.ts // where FS events are handled for Web UI. diff --git a/lib/teleterm/services/desktop/directorysharing_test.go b/lib/teleterm/services/desktop/directorysharing_test.go index 8fe3ec906f22a..21a11e3fffa1e 100644 --- a/lib/teleterm/services/desktop/directorysharing_test.go +++ b/lib/teleterm/services/desktop/directorysharing_test.go @@ -23,8 +23,52 @@ import ( "github.com/gravitational/trace" "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/lib/teleterm/api/uri" ) +var targetDesktop = TargetSession{ + DesktopURI: uri.NewClusterURI("foo").AppendWindowsDesktop("bar"), + Login: "admin", +} + +func TestRegisterSharedDirectory(t *testing.T) { + manager := NewDirectorySharingManager() + + // Clean state, register the first handler. + _, unregister, err := manager.Register(targetDesktop) + require.NoError(t, err) + // Remove the registered handler. + unregister() + + // Register the handler again. + _, unregister, err = manager.Register(targetDesktop) + require.NoError(t, err) + // Do not unregister it immediately. + defer unregister() + + // Try to register the handler again, it should return the error. + _, _, err = manager.Register(targetDesktop) + require.True(t, trace.IsAlreadyExists(err)) +} + +func TestGetSharedDirectory(t *testing.T) { + manager := NewDirectorySharingManager() + + _, unregister, err := manager.Register(targetDesktop) + require.NoError(t, err) + + access, err := manager.Get(targetDesktop) + require.NoError(t, err) + require.NotNil(t, access) + + // Remove the registered handler. + unregister() + + _, err = manager.Get(targetDesktop) + require.True(t, trace.IsNotFound(err)) +} + func TestOpenSharedDirectory(t *testing.T) { path := t.TempDir() filePath := filepath.Join(path, testFilename) From e601b245039c754c2c24453f6de40f6ce7296972 Mon Sep 17 00:00:00 2001 From: Grzegorz Zdunek Date: Fri, 9 May 2025 13:06:34 +0200 Subject: [PATCH 02/14] Add RPC to attach a directory to desktop session --- .../go/teleport/lib/teleterm/v1/service.pb.go | 342 ++++++++++++------ .../lib/teleterm/v1/service_grpc.pb.go | 50 +++ .../lib/teleterm/v1/service_pb.client.ts | 27 ++ .../lib/teleterm/v1/service_pb.grpc-server.ts | 23 ++ .../ts/teleport/lib/teleterm/v1/service_pb.ts | 123 ++++++- .../apiserver/handler/handler_desktops.go | 17 +- lib/teleterm/daemon/daemon.go | 12 + proto/teleport/lib/teleterm/v1/service.proto | 20 + .../src/services/tshd/fixtures/mocks.ts | 1 + 9 files changed, 498 insertions(+), 117 deletions(-) diff --git a/gen/proto/go/teleport/lib/teleterm/v1/service.pb.go b/gen/proto/go/teleport/lib/teleterm/v1/service.pb.go index 9265624585c97..3cb6b645d09ac 100644 --- a/gen/proto/go/teleport/lib/teleterm/v1/service.pb.go +++ b/gen/proto/go/teleport/lib/teleterm/v1/service.pb.go @@ -4252,6 +4252,107 @@ func (x *ConnectToDesktopResponse) GetData() []byte { return nil } +// Request for AttachDirectoryToDesktopSession. +type AttachDirectoryToDesktopSessionRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // URI of the desktop. + DesktopUri string `protobuf:"bytes,1,opt,name=desktop_uri,json=desktopUri,proto3" json:"desktop_uri,omitempty"` + // Login for the desktop session. + Login string `protobuf:"bytes,2,opt,name=login,proto3" json:"login,omitempty"` + // Path to share with a remote machine. Must be a directory. + Path string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AttachDirectoryToDesktopSessionRequest) Reset() { + *x = AttachDirectoryToDesktopSessionRequest{} + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[75] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AttachDirectoryToDesktopSessionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AttachDirectoryToDesktopSessionRequest) ProtoMessage() {} + +func (x *AttachDirectoryToDesktopSessionRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[75] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AttachDirectoryToDesktopSessionRequest.ProtoReflect.Descriptor instead. +func (*AttachDirectoryToDesktopSessionRequest) Descriptor() ([]byte, []int) { + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{75} +} + +func (x *AttachDirectoryToDesktopSessionRequest) GetDesktopUri() string { + if x != nil { + return x.DesktopUri + } + return "" +} + +func (x *AttachDirectoryToDesktopSessionRequest) GetLogin() string { + if x != nil { + return x.Login + } + return "" +} + +func (x *AttachDirectoryToDesktopSessionRequest) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +// Response for AttachDirectoryToDesktopSession. +type AttachDirectoryToDesktopSessionResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AttachDirectoryToDesktopSessionResponse) Reset() { + *x = AttachDirectoryToDesktopSessionResponse{} + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[76] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AttachDirectoryToDesktopSessionResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AttachDirectoryToDesktopSessionResponse) ProtoMessage() {} + +func (x *AttachDirectoryToDesktopSessionResponse) ProtoReflect() protoreflect.Message { + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[76] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AttachDirectoryToDesktopSessionResponse.ProtoReflect.Descriptor instead. +func (*AttachDirectoryToDesktopSessionResponse) Descriptor() ([]byte, []int) { + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{76} +} + // LoginPasswordlessRequestInit contains fields needed to init the stream request. type LoginPasswordlessRequest_LoginPasswordlessRequestInit struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -4263,7 +4364,7 @@ type LoginPasswordlessRequest_LoginPasswordlessRequestInit struct { func (x *LoginPasswordlessRequest_LoginPasswordlessRequestInit) Reset() { *x = LoginPasswordlessRequest_LoginPasswordlessRequestInit{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[75] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4275,7 +4376,7 @@ func (x *LoginPasswordlessRequest_LoginPasswordlessRequestInit) String() string func (*LoginPasswordlessRequest_LoginPasswordlessRequestInit) ProtoMessage() {} func (x *LoginPasswordlessRequest_LoginPasswordlessRequestInit) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[75] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[77] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4309,7 +4410,7 @@ type LoginPasswordlessRequest_LoginPasswordlessPINResponse struct { func (x *LoginPasswordlessRequest_LoginPasswordlessPINResponse) Reset() { *x = LoginPasswordlessRequest_LoginPasswordlessPINResponse{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[76] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4321,7 +4422,7 @@ func (x *LoginPasswordlessRequest_LoginPasswordlessPINResponse) String() string func (*LoginPasswordlessRequest_LoginPasswordlessPINResponse) ProtoMessage() {} func (x *LoginPasswordlessRequest_LoginPasswordlessPINResponse) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[76] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[78] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4357,7 +4458,7 @@ type LoginPasswordlessRequest_LoginPasswordlessCredentialResponse struct { func (x *LoginPasswordlessRequest_LoginPasswordlessCredentialResponse) Reset() { *x = LoginPasswordlessRequest_LoginPasswordlessCredentialResponse{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[77] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4369,7 +4470,7 @@ func (x *LoginPasswordlessRequest_LoginPasswordlessCredentialResponse) String() func (*LoginPasswordlessRequest_LoginPasswordlessCredentialResponse) ProtoMessage() {} func (x *LoginPasswordlessRequest_LoginPasswordlessCredentialResponse) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[77] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[79] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4407,7 +4508,7 @@ type LoginRequest_LocalParams struct { func (x *LoginRequest_LocalParams) Reset() { *x = LoginRequest_LocalParams{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[78] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4419,7 +4520,7 @@ func (x *LoginRequest_LocalParams) String() string { func (*LoginRequest_LocalParams) ProtoMessage() {} func (x *LoginRequest_LocalParams) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[78] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[80] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4469,7 +4570,7 @@ type LoginRequest_SsoParams struct { func (x *LoginRequest_SsoParams) Reset() { *x = LoginRequest_SsoParams{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[79] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4481,7 +4582,7 @@ func (x *LoginRequest_SsoParams) String() string { func (*LoginRequest_SsoParams) ProtoMessage() {} func (x *LoginRequest_SsoParams) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[79] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[81] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4783,7 +4884,13 @@ const file_teleport_lib_teleterm_v1_service_proto_rawDesc = "" + "\x04data\x18\x01 \x01(\fR\x04data\x12N\n" + "\x0etarget_desktop\x18\x02 \x01(\v2'.teleport.lib.teleterm.v1.TargetDesktopR\rtargetDesktop\".\n" + "\x18ConnectToDesktopResponse\x12\x12\n" + - "\x04data\x18\x01 \x01(\fR\x04data*\x97\x01\n" + + "\x04data\x18\x01 \x01(\fR\x04data\"s\n" + + "&AttachDirectoryToDesktopSessionRequest\x12\x1f\n" + + "\vdesktop_uri\x18\x01 \x01(\tR\n" + + "desktopUri\x12\x14\n" + + "\x05login\x18\x02 \x01(\tR\x05login\x12\x12\n" + + "\x04path\x18\x03 \x01(\tR\x04path\")\n" + + "'AttachDirectoryToDesktopSessionResponse*\x97\x01\n" + "\x12PasswordlessPrompt\x12#\n" + "\x1fPASSWORDLESS_PROMPT_UNSPECIFIED\x10\x00\x12\x1b\n" + "\x17PASSWORDLESS_PROMPT_PIN\x10\x01\x12\x1b\n" + @@ -4797,7 +4904,7 @@ const file_teleport_lib_teleterm_v1_service_proto_rawDesc = "" + ")HEADLESS_AUTHENTICATION_STATE_UNSPECIFIED\x10\x00\x12)\n" + "%HEADLESS_AUTHENTICATION_STATE_PENDING\x10\x01\x12(\n" + "$HEADLESS_AUTHENTICATION_STATE_DENIED\x10\x02\x12*\n" + - "&HEADLESS_AUTHENTICATION_STATE_APPROVED\x10\x032\xdd)\n" + + "&HEADLESS_AUTHENTICATION_STATE_APPROVED\x10\x032\x86+\n" + "\x0fTerminalService\x12\xa0\x01\n" + "\x1dUpdateTshdEventsServerAddress\x12>.teleport.lib.teleterm.v1.UpdateTshdEventsServerAddressRequest\x1a?.teleport.lib.teleterm.v1.UpdateTshdEventsServerAddressResponse\x12q\n" + "\x10ListRootClusters\x12-.teleport.lib.teleterm.v1.ListClustersRequest\x1a..teleport.lib.teleterm.v1.ListClustersResponse\x12u\n" + @@ -4844,7 +4951,8 @@ const file_teleport_lib_teleterm_v1_service_proto_rawDesc = "" + "\x15UpdateUserPreferences\x126.teleport.lib.teleterm.v1.UpdateUserPreferencesRequest\x1a7.teleport.lib.teleterm.v1.UpdateUserPreferencesResponse\x12\x88\x01\n" + "\x15AuthenticateWebDevice\x126.teleport.lib.teleterm.v1.AuthenticateWebDeviceRequest\x1a7.teleport.lib.teleterm.v1.AuthenticateWebDeviceResponse\x12[\n" + "\x06GetApp\x12'.teleport.lib.teleterm.v1.GetAppRequest\x1a(.teleport.lib.teleterm.v1.GetAppResponse\x12}\n" + - "\x10ConnectToDesktop\x121.teleport.lib.teleterm.v1.ConnectToDesktopRequest\x1a2.teleport.lib.teleterm.v1.ConnectToDesktopResponse(\x010\x01BTZRgithub.com/gravitational/teleport/gen/proto/go/teleport/lib/teleterm/v1;teletermv1b\x06proto3" + "\x10ConnectToDesktop\x121.teleport.lib.teleterm.v1.ConnectToDesktopRequest\x1a2.teleport.lib.teleterm.v1.ConnectToDesktopResponse(\x010\x01\x12\xa6\x01\n" + + "\x1fAttachDirectoryToDesktopSession\x12@.teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionRequest\x1aA.teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionResponseBTZRgithub.com/gravitational/teleport/gen/proto/go/teleport/lib/teleterm/v1;teletermv1b\x06proto3" var ( file_teleport_lib_teleterm_v1_service_proto_rawDescOnce sync.Once @@ -4859,7 +4967,7 @@ func file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP() []byte { } var file_teleport_lib_teleterm_v1_service_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_teleport_lib_teleterm_v1_service_proto_msgTypes = make([]protoimpl.MessageInfo, 80) +var file_teleport_lib_teleterm_v1_service_proto_msgTypes = make([]protoimpl.MessageInfo, 82) var file_teleport_lib_teleterm_v1_service_proto_goTypes = []any{ (PasswordlessPrompt)(0), // 0: teleport.lib.teleterm.v1.PasswordlessPrompt (FileTransferDirection)(0), // 1: teleport.lib.teleterm.v1.FileTransferDirection @@ -4939,72 +5047,74 @@ var file_teleport_lib_teleterm_v1_service_proto_goTypes = []any{ (*TargetDesktop)(nil), // 75: teleport.lib.teleterm.v1.TargetDesktop (*ConnectToDesktopRequest)(nil), // 76: teleport.lib.teleterm.v1.ConnectToDesktopRequest (*ConnectToDesktopResponse)(nil), // 77: teleport.lib.teleterm.v1.ConnectToDesktopResponse - (*LoginPasswordlessRequest_LoginPasswordlessRequestInit)(nil), // 78: teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessRequestInit - (*LoginPasswordlessRequest_LoginPasswordlessPINResponse)(nil), // 79: teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessPINResponse - (*LoginPasswordlessRequest_LoginPasswordlessCredentialResponse)(nil), // 80: teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessCredentialResponse - (*LoginRequest_LocalParams)(nil), // 81: teleport.lib.teleterm.v1.LoginRequest.LocalParams - (*LoginRequest_SsoParams)(nil), // 82: teleport.lib.teleterm.v1.LoginRequest.SsoParams - (*AccessRequest)(nil), // 83: teleport.lib.teleterm.v1.AccessRequest - (*ResourceID)(nil), // 84: teleport.lib.teleterm.v1.ResourceID - (*timestamppb.Timestamp)(nil), // 85: google.protobuf.Timestamp - (*v1.AccessList)(nil), // 86: teleport.accesslist.v1.AccessList - (*KubeResource)(nil), // 87: teleport.lib.teleterm.v1.KubeResource - (*Cluster)(nil), // 88: teleport.lib.teleterm.v1.Cluster - (*Gateway)(nil), // 89: teleport.lib.teleterm.v1.Gateway - (*Server)(nil), // 90: teleport.lib.teleterm.v1.Server - (*Database)(nil), // 91: teleport.lib.teleterm.v1.Database - (*Kube)(nil), // 92: teleport.lib.teleterm.v1.Kube - (*App)(nil), // 93: teleport.lib.teleterm.v1.App - (*WindowsDesktop)(nil), // 94: teleport.lib.teleterm.v1.WindowsDesktop - (*v11.ClusterUserPreferences)(nil), // 95: teleport.userpreferences.v1.ClusterUserPreferences - (*v11.UnifiedResourcePreferences)(nil), // 96: teleport.userpreferences.v1.UnifiedResourcePreferences - (*v12.DeviceWebToken)(nil), // 97: teleport.devicetrust.v1.DeviceWebToken - (*v12.DeviceConfirmationToken)(nil), // 98: teleport.devicetrust.v1.DeviceConfirmationToken - (*ReportUsageEventRequest)(nil), // 99: teleport.lib.teleterm.v1.ReportUsageEventRequest - (*AuthSettings)(nil), // 100: teleport.lib.teleterm.v1.AuthSettings + (*AttachDirectoryToDesktopSessionRequest)(nil), // 78: teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionRequest + (*AttachDirectoryToDesktopSessionResponse)(nil), // 79: teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionResponse + (*LoginPasswordlessRequest_LoginPasswordlessRequestInit)(nil), // 80: teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessRequestInit + (*LoginPasswordlessRequest_LoginPasswordlessPINResponse)(nil), // 81: teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessPINResponse + (*LoginPasswordlessRequest_LoginPasswordlessCredentialResponse)(nil), // 82: teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessCredentialResponse + (*LoginRequest_LocalParams)(nil), // 83: teleport.lib.teleterm.v1.LoginRequest.LocalParams + (*LoginRequest_SsoParams)(nil), // 84: teleport.lib.teleterm.v1.LoginRequest.SsoParams + (*AccessRequest)(nil), // 85: teleport.lib.teleterm.v1.AccessRequest + (*ResourceID)(nil), // 86: teleport.lib.teleterm.v1.ResourceID + (*timestamppb.Timestamp)(nil), // 87: google.protobuf.Timestamp + (*v1.AccessList)(nil), // 88: teleport.accesslist.v1.AccessList + (*KubeResource)(nil), // 89: teleport.lib.teleterm.v1.KubeResource + (*Cluster)(nil), // 90: teleport.lib.teleterm.v1.Cluster + (*Gateway)(nil), // 91: teleport.lib.teleterm.v1.Gateway + (*Server)(nil), // 92: teleport.lib.teleterm.v1.Server + (*Database)(nil), // 93: teleport.lib.teleterm.v1.Database + (*Kube)(nil), // 94: teleport.lib.teleterm.v1.Kube + (*App)(nil), // 95: teleport.lib.teleterm.v1.App + (*WindowsDesktop)(nil), // 96: teleport.lib.teleterm.v1.WindowsDesktop + (*v11.ClusterUserPreferences)(nil), // 97: teleport.userpreferences.v1.ClusterUserPreferences + (*v11.UnifiedResourcePreferences)(nil), // 98: teleport.userpreferences.v1.UnifiedResourcePreferences + (*v12.DeviceWebToken)(nil), // 99: teleport.devicetrust.v1.DeviceWebToken + (*v12.DeviceConfirmationToken)(nil), // 100: teleport.devicetrust.v1.DeviceConfirmationToken + (*ReportUsageEventRequest)(nil), // 101: teleport.lib.teleterm.v1.ReportUsageEventRequest + (*AuthSettings)(nil), // 102: teleport.lib.teleterm.v1.AuthSettings } var file_teleport_lib_teleterm_v1_service_proto_depIdxs = []int32{ - 83, // 0: teleport.lib.teleterm.v1.GetAccessRequestResponse.request:type_name -> teleport.lib.teleterm.v1.AccessRequest - 83, // 1: teleport.lib.teleterm.v1.GetAccessRequestsResponse.requests:type_name -> teleport.lib.teleterm.v1.AccessRequest - 84, // 2: teleport.lib.teleterm.v1.CreateAccessRequestRequest.resource_ids:type_name -> teleport.lib.teleterm.v1.ResourceID - 85, // 3: teleport.lib.teleterm.v1.CreateAccessRequestRequest.assume_start_time:type_name -> google.protobuf.Timestamp - 85, // 4: teleport.lib.teleterm.v1.CreateAccessRequestRequest.max_duration:type_name -> google.protobuf.Timestamp - 85, // 5: teleport.lib.teleterm.v1.CreateAccessRequestRequest.request_ttl:type_name -> google.protobuf.Timestamp - 83, // 6: teleport.lib.teleterm.v1.CreateAccessRequestResponse.request:type_name -> teleport.lib.teleterm.v1.AccessRequest - 84, // 7: teleport.lib.teleterm.v1.GetRequestableRolesRequest.resource_ids:type_name -> teleport.lib.teleterm.v1.ResourceID - 85, // 8: teleport.lib.teleterm.v1.ReviewAccessRequestRequest.assume_start_time:type_name -> google.protobuf.Timestamp - 83, // 9: teleport.lib.teleterm.v1.ReviewAccessRequestResponse.request:type_name -> teleport.lib.teleterm.v1.AccessRequest - 83, // 10: teleport.lib.teleterm.v1.PromoteAccessRequestResponse.request:type_name -> teleport.lib.teleterm.v1.AccessRequest - 86, // 11: teleport.lib.teleterm.v1.GetSuggestedAccessListsResponse.access_lists:type_name -> teleport.accesslist.v1.AccessList - 87, // 12: teleport.lib.teleterm.v1.ListKubernetesResourcesResponse.resources:type_name -> teleport.lib.teleterm.v1.KubeResource + 85, // 0: teleport.lib.teleterm.v1.GetAccessRequestResponse.request:type_name -> teleport.lib.teleterm.v1.AccessRequest + 85, // 1: teleport.lib.teleterm.v1.GetAccessRequestsResponse.requests:type_name -> teleport.lib.teleterm.v1.AccessRequest + 86, // 2: teleport.lib.teleterm.v1.CreateAccessRequestRequest.resource_ids:type_name -> teleport.lib.teleterm.v1.ResourceID + 87, // 3: teleport.lib.teleterm.v1.CreateAccessRequestRequest.assume_start_time:type_name -> google.protobuf.Timestamp + 87, // 4: teleport.lib.teleterm.v1.CreateAccessRequestRequest.max_duration:type_name -> google.protobuf.Timestamp + 87, // 5: teleport.lib.teleterm.v1.CreateAccessRequestRequest.request_ttl:type_name -> google.protobuf.Timestamp + 85, // 6: teleport.lib.teleterm.v1.CreateAccessRequestResponse.request:type_name -> teleport.lib.teleterm.v1.AccessRequest + 86, // 7: teleport.lib.teleterm.v1.GetRequestableRolesRequest.resource_ids:type_name -> teleport.lib.teleterm.v1.ResourceID + 87, // 8: teleport.lib.teleterm.v1.ReviewAccessRequestRequest.assume_start_time:type_name -> google.protobuf.Timestamp + 85, // 9: teleport.lib.teleterm.v1.ReviewAccessRequestResponse.request:type_name -> teleport.lib.teleterm.v1.AccessRequest + 85, // 10: teleport.lib.teleterm.v1.PromoteAccessRequestResponse.request:type_name -> teleport.lib.teleterm.v1.AccessRequest + 88, // 11: teleport.lib.teleterm.v1.GetSuggestedAccessListsResponse.access_lists:type_name -> teleport.accesslist.v1.AccessList + 89, // 12: teleport.lib.teleterm.v1.ListKubernetesResourcesResponse.resources:type_name -> teleport.lib.teleterm.v1.KubeResource 0, // 13: teleport.lib.teleterm.v1.LoginPasswordlessResponse.prompt:type_name -> teleport.lib.teleterm.v1.PasswordlessPrompt 27, // 14: teleport.lib.teleterm.v1.LoginPasswordlessResponse.credentials:type_name -> teleport.lib.teleterm.v1.CredentialInfo - 78, // 15: teleport.lib.teleterm.v1.LoginPasswordlessRequest.init:type_name -> teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessRequestInit - 79, // 16: teleport.lib.teleterm.v1.LoginPasswordlessRequest.pin:type_name -> teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessPINResponse - 80, // 17: teleport.lib.teleterm.v1.LoginPasswordlessRequest.credential:type_name -> teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessCredentialResponse + 80, // 15: teleport.lib.teleterm.v1.LoginPasswordlessRequest.init:type_name -> teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessRequestInit + 81, // 16: teleport.lib.teleterm.v1.LoginPasswordlessRequest.pin:type_name -> teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessPINResponse + 82, // 17: teleport.lib.teleterm.v1.LoginPasswordlessRequest.credential:type_name -> teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessCredentialResponse 1, // 18: teleport.lib.teleterm.v1.FileTransferRequest.direction:type_name -> teleport.lib.teleterm.v1.FileTransferDirection - 81, // 19: teleport.lib.teleterm.v1.LoginRequest.local:type_name -> teleport.lib.teleterm.v1.LoginRequest.LocalParams - 82, // 20: teleport.lib.teleterm.v1.LoginRequest.sso:type_name -> teleport.lib.teleterm.v1.LoginRequest.SsoParams - 88, // 21: teleport.lib.teleterm.v1.ListClustersResponse.clusters:type_name -> teleport.lib.teleterm.v1.Cluster - 89, // 22: teleport.lib.teleterm.v1.ListGatewaysResponse.gateways:type_name -> teleport.lib.teleterm.v1.Gateway - 90, // 23: teleport.lib.teleterm.v1.GetServersResponse.agents:type_name -> teleport.lib.teleterm.v1.Server + 83, // 19: teleport.lib.teleterm.v1.LoginRequest.local:type_name -> teleport.lib.teleterm.v1.LoginRequest.LocalParams + 84, // 20: teleport.lib.teleterm.v1.LoginRequest.sso:type_name -> teleport.lib.teleterm.v1.LoginRequest.SsoParams + 90, // 21: teleport.lib.teleterm.v1.ListClustersResponse.clusters:type_name -> teleport.lib.teleterm.v1.Cluster + 91, // 22: teleport.lib.teleterm.v1.ListGatewaysResponse.gateways:type_name -> teleport.lib.teleterm.v1.Gateway + 92, // 23: teleport.lib.teleterm.v1.GetServersResponse.agents:type_name -> teleport.lib.teleterm.v1.Server 2, // 24: teleport.lib.teleterm.v1.UpdateHeadlessAuthenticationStateRequest.state:type_name -> teleport.lib.teleterm.v1.HeadlessAuthenticationState - 90, // 25: teleport.lib.teleterm.v1.WaitForConnectMyComputerNodeJoinResponse.server:type_name -> teleport.lib.teleterm.v1.Server + 92, // 25: teleport.lib.teleterm.v1.WaitForConnectMyComputerNodeJoinResponse.server:type_name -> teleport.lib.teleterm.v1.Server 63, // 26: teleport.lib.teleterm.v1.ListUnifiedResourcesRequest.sort_by:type_name -> teleport.lib.teleterm.v1.SortBy 65, // 27: teleport.lib.teleterm.v1.ListUnifiedResourcesResponse.resources:type_name -> teleport.lib.teleterm.v1.PaginatedResource - 91, // 28: teleport.lib.teleterm.v1.PaginatedResource.database:type_name -> teleport.lib.teleterm.v1.Database - 90, // 29: teleport.lib.teleterm.v1.PaginatedResource.server:type_name -> teleport.lib.teleterm.v1.Server - 92, // 30: teleport.lib.teleterm.v1.PaginatedResource.kube:type_name -> teleport.lib.teleterm.v1.Kube - 93, // 31: teleport.lib.teleterm.v1.PaginatedResource.app:type_name -> teleport.lib.teleterm.v1.App - 94, // 32: teleport.lib.teleterm.v1.PaginatedResource.windows_desktop:type_name -> teleport.lib.teleterm.v1.WindowsDesktop + 93, // 28: teleport.lib.teleterm.v1.PaginatedResource.database:type_name -> teleport.lib.teleterm.v1.Database + 92, // 29: teleport.lib.teleterm.v1.PaginatedResource.server:type_name -> teleport.lib.teleterm.v1.Server + 94, // 30: teleport.lib.teleterm.v1.PaginatedResource.kube:type_name -> teleport.lib.teleterm.v1.Kube + 95, // 31: teleport.lib.teleterm.v1.PaginatedResource.app:type_name -> teleport.lib.teleterm.v1.App + 96, // 32: teleport.lib.teleterm.v1.PaginatedResource.windows_desktop:type_name -> teleport.lib.teleterm.v1.WindowsDesktop 70, // 33: teleport.lib.teleterm.v1.GetUserPreferencesResponse.user_preferences:type_name -> teleport.lib.teleterm.v1.UserPreferences 70, // 34: teleport.lib.teleterm.v1.UpdateUserPreferencesRequest.user_preferences:type_name -> teleport.lib.teleterm.v1.UserPreferences 70, // 35: teleport.lib.teleterm.v1.UpdateUserPreferencesResponse.user_preferences:type_name -> teleport.lib.teleterm.v1.UserPreferences - 95, // 36: teleport.lib.teleterm.v1.UserPreferences.cluster_preferences:type_name -> teleport.userpreferences.v1.ClusterUserPreferences - 96, // 37: teleport.lib.teleterm.v1.UserPreferences.unified_resource_preferences:type_name -> teleport.userpreferences.v1.UnifiedResourcePreferences - 97, // 38: teleport.lib.teleterm.v1.AuthenticateWebDeviceRequest.device_web_token:type_name -> teleport.devicetrust.v1.DeviceWebToken - 98, // 39: teleport.lib.teleterm.v1.AuthenticateWebDeviceResponse.confirmation_token:type_name -> teleport.devicetrust.v1.DeviceConfirmationToken - 93, // 40: teleport.lib.teleterm.v1.GetAppResponse.app:type_name -> teleport.lib.teleterm.v1.App + 97, // 36: teleport.lib.teleterm.v1.UserPreferences.cluster_preferences:type_name -> teleport.userpreferences.v1.ClusterUserPreferences + 98, // 37: teleport.lib.teleterm.v1.UserPreferences.unified_resource_preferences:type_name -> teleport.userpreferences.v1.UnifiedResourcePreferences + 99, // 38: teleport.lib.teleterm.v1.AuthenticateWebDeviceRequest.device_web_token:type_name -> teleport.devicetrust.v1.DeviceWebToken + 100, // 39: teleport.lib.teleterm.v1.AuthenticateWebDeviceResponse.confirmation_token:type_name -> teleport.devicetrust.v1.DeviceConfirmationToken + 95, // 40: teleport.lib.teleterm.v1.GetAppResponse.app:type_name -> teleport.lib.teleterm.v1.App 75, // 41: teleport.lib.teleterm.v1.ConnectToDesktopRequest.target_desktop:type_name -> teleport.lib.teleterm.v1.TargetDesktop 48, // 42: teleport.lib.teleterm.v1.TerminalService.UpdateTshdEventsServerAddress:input_type -> teleport.lib.teleterm.v1.UpdateTshdEventsServerAddressRequest 34, // 43: teleport.lib.teleterm.v1.TerminalService.ListRootClusters:input_type -> teleport.lib.teleterm.v1.ListClustersRequest @@ -5035,7 +5145,7 @@ var file_teleport_lib_teleterm_v1_service_proto_depIdxs = []int32{ 29, // 68: teleport.lib.teleterm.v1.TerminalService.LoginPasswordless:input_type -> teleport.lib.teleterm.v1.LoginPasswordlessRequest 6, // 69: teleport.lib.teleterm.v1.TerminalService.Logout:input_type -> teleport.lib.teleterm.v1.LogoutRequest 30, // 70: teleport.lib.teleterm.v1.TerminalService.TransferFile:input_type -> teleport.lib.teleterm.v1.FileTransferRequest - 99, // 71: teleport.lib.teleterm.v1.TerminalService.ReportUsageEvent:input_type -> teleport.lib.teleterm.v1.ReportUsageEventRequest + 101, // 71: teleport.lib.teleterm.v1.TerminalService.ReportUsageEvent:input_type -> teleport.lib.teleterm.v1.ReportUsageEventRequest 50, // 72: teleport.lib.teleterm.v1.TerminalService.UpdateHeadlessAuthenticationState:input_type -> teleport.lib.teleterm.v1.UpdateHeadlessAuthenticationStateRequest 52, // 73: teleport.lib.teleterm.v1.TerminalService.CreateConnectMyComputerRole:input_type -> teleport.lib.teleterm.v1.CreateConnectMyComputerRoleRequest 54, // 74: teleport.lib.teleterm.v1.TerminalService.CreateConnectMyComputerNodeToken:input_type -> teleport.lib.teleterm.v1.CreateConnectMyComputerNodeTokenRequest @@ -5048,50 +5158,52 @@ var file_teleport_lib_teleterm_v1_service_proto_depIdxs = []int32{ 71, // 81: teleport.lib.teleterm.v1.TerminalService.AuthenticateWebDevice:input_type -> teleport.lib.teleterm.v1.AuthenticateWebDeviceRequest 73, // 82: teleport.lib.teleterm.v1.TerminalService.GetApp:input_type -> teleport.lib.teleterm.v1.GetAppRequest 76, // 83: teleport.lib.teleterm.v1.TerminalService.ConnectToDesktop:input_type -> teleport.lib.teleterm.v1.ConnectToDesktopRequest - 49, // 84: teleport.lib.teleterm.v1.TerminalService.UpdateTshdEventsServerAddress:output_type -> teleport.lib.teleterm.v1.UpdateTshdEventsServerAddressResponse - 35, // 85: teleport.lib.teleterm.v1.TerminalService.ListRootClusters:output_type -> teleport.lib.teleterm.v1.ListClustersResponse - 35, // 86: teleport.lib.teleterm.v1.TerminalService.ListLeafClusters:output_type -> teleport.lib.teleterm.v1.ListClustersResponse - 8, // 87: teleport.lib.teleterm.v1.TerminalService.StartHeadlessWatcher:output_type -> teleport.lib.teleterm.v1.StartHeadlessWatcherResponse - 38, // 88: teleport.lib.teleterm.v1.TerminalService.ListDatabaseUsers:output_type -> teleport.lib.teleterm.v1.ListDatabaseUsersResponse - 46, // 89: teleport.lib.teleterm.v1.TerminalService.GetServers:output_type -> teleport.lib.teleterm.v1.GetServersResponse - 12, // 90: teleport.lib.teleterm.v1.TerminalService.GetAccessRequests:output_type -> teleport.lib.teleterm.v1.GetAccessRequestsResponse - 11, // 91: teleport.lib.teleterm.v1.TerminalService.GetAccessRequest:output_type -> teleport.lib.teleterm.v1.GetAccessRequestResponse - 3, // 92: teleport.lib.teleterm.v1.TerminalService.DeleteAccessRequest:output_type -> teleport.lib.teleterm.v1.EmptyResponse - 15, // 93: teleport.lib.teleterm.v1.TerminalService.CreateAccessRequest:output_type -> teleport.lib.teleterm.v1.CreateAccessRequestResponse - 20, // 94: teleport.lib.teleterm.v1.TerminalService.ReviewAccessRequest:output_type -> teleport.lib.teleterm.v1.ReviewAccessRequestResponse - 18, // 95: teleport.lib.teleterm.v1.TerminalService.GetRequestableRoles:output_type -> teleport.lib.teleterm.v1.GetRequestableRolesResponse - 3, // 96: teleport.lib.teleterm.v1.TerminalService.AssumeRole:output_type -> teleport.lib.teleterm.v1.EmptyResponse - 22, // 97: teleport.lib.teleterm.v1.TerminalService.PromoteAccessRequest:output_type -> teleport.lib.teleterm.v1.PromoteAccessRequestResponse - 24, // 98: teleport.lib.teleterm.v1.TerminalService.GetSuggestedAccessLists:output_type -> teleport.lib.teleterm.v1.GetSuggestedAccessListsResponse - 26, // 99: teleport.lib.teleterm.v1.TerminalService.ListKubernetesResources:output_type -> teleport.lib.teleterm.v1.ListKubernetesResourcesResponse - 88, // 100: teleport.lib.teleterm.v1.TerminalService.AddCluster:output_type -> teleport.lib.teleterm.v1.Cluster - 3, // 101: teleport.lib.teleterm.v1.TerminalService.RemoveCluster:output_type -> teleport.lib.teleterm.v1.EmptyResponse - 41, // 102: teleport.lib.teleterm.v1.TerminalService.ListGateways:output_type -> teleport.lib.teleterm.v1.ListGatewaysResponse - 89, // 103: teleport.lib.teleterm.v1.TerminalService.CreateGateway:output_type -> teleport.lib.teleterm.v1.Gateway - 3, // 104: teleport.lib.teleterm.v1.TerminalService.RemoveGateway:output_type -> teleport.lib.teleterm.v1.EmptyResponse - 89, // 105: teleport.lib.teleterm.v1.TerminalService.SetGatewayTargetSubresourceName:output_type -> teleport.lib.teleterm.v1.Gateway - 89, // 106: teleport.lib.teleterm.v1.TerminalService.SetGatewayLocalPort:output_type -> teleport.lib.teleterm.v1.Gateway - 100, // 107: teleport.lib.teleterm.v1.TerminalService.GetAuthSettings:output_type -> teleport.lib.teleterm.v1.AuthSettings - 88, // 108: teleport.lib.teleterm.v1.TerminalService.GetCluster:output_type -> teleport.lib.teleterm.v1.Cluster - 3, // 109: teleport.lib.teleterm.v1.TerminalService.Login:output_type -> teleport.lib.teleterm.v1.EmptyResponse - 28, // 110: teleport.lib.teleterm.v1.TerminalService.LoginPasswordless:output_type -> teleport.lib.teleterm.v1.LoginPasswordlessResponse - 3, // 111: teleport.lib.teleterm.v1.TerminalService.Logout:output_type -> teleport.lib.teleterm.v1.EmptyResponse - 31, // 112: teleport.lib.teleterm.v1.TerminalService.TransferFile:output_type -> teleport.lib.teleterm.v1.FileTransferProgress - 3, // 113: teleport.lib.teleterm.v1.TerminalService.ReportUsageEvent:output_type -> teleport.lib.teleterm.v1.EmptyResponse - 51, // 114: teleport.lib.teleterm.v1.TerminalService.UpdateHeadlessAuthenticationState:output_type -> teleport.lib.teleterm.v1.UpdateHeadlessAuthenticationStateResponse - 53, // 115: teleport.lib.teleterm.v1.TerminalService.CreateConnectMyComputerRole:output_type -> teleport.lib.teleterm.v1.CreateConnectMyComputerRoleResponse - 55, // 116: teleport.lib.teleterm.v1.TerminalService.CreateConnectMyComputerNodeToken:output_type -> teleport.lib.teleterm.v1.CreateConnectMyComputerNodeTokenResponse - 57, // 117: teleport.lib.teleterm.v1.TerminalService.WaitForConnectMyComputerNodeJoin:output_type -> teleport.lib.teleterm.v1.WaitForConnectMyComputerNodeJoinResponse - 59, // 118: teleport.lib.teleterm.v1.TerminalService.DeleteConnectMyComputerNode:output_type -> teleport.lib.teleterm.v1.DeleteConnectMyComputerNodeResponse - 61, // 119: teleport.lib.teleterm.v1.TerminalService.GetConnectMyComputerNodeName:output_type -> teleport.lib.teleterm.v1.GetConnectMyComputerNodeNameResponse - 64, // 120: teleport.lib.teleterm.v1.TerminalService.ListUnifiedResources:output_type -> teleport.lib.teleterm.v1.ListUnifiedResourcesResponse - 67, // 121: teleport.lib.teleterm.v1.TerminalService.GetUserPreferences:output_type -> teleport.lib.teleterm.v1.GetUserPreferencesResponse - 69, // 122: teleport.lib.teleterm.v1.TerminalService.UpdateUserPreferences:output_type -> teleport.lib.teleterm.v1.UpdateUserPreferencesResponse - 72, // 123: teleport.lib.teleterm.v1.TerminalService.AuthenticateWebDevice:output_type -> teleport.lib.teleterm.v1.AuthenticateWebDeviceResponse - 74, // 124: teleport.lib.teleterm.v1.TerminalService.GetApp:output_type -> teleport.lib.teleterm.v1.GetAppResponse - 77, // 125: teleport.lib.teleterm.v1.TerminalService.ConnectToDesktop:output_type -> teleport.lib.teleterm.v1.ConnectToDesktopResponse - 84, // [84:126] is the sub-list for method output_type - 42, // [42:84] is the sub-list for method input_type + 78, // 84: teleport.lib.teleterm.v1.TerminalService.AttachDirectoryToDesktopSession:input_type -> teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionRequest + 49, // 85: teleport.lib.teleterm.v1.TerminalService.UpdateTshdEventsServerAddress:output_type -> teleport.lib.teleterm.v1.UpdateTshdEventsServerAddressResponse + 35, // 86: teleport.lib.teleterm.v1.TerminalService.ListRootClusters:output_type -> teleport.lib.teleterm.v1.ListClustersResponse + 35, // 87: teleport.lib.teleterm.v1.TerminalService.ListLeafClusters:output_type -> teleport.lib.teleterm.v1.ListClustersResponse + 8, // 88: teleport.lib.teleterm.v1.TerminalService.StartHeadlessWatcher:output_type -> teleport.lib.teleterm.v1.StartHeadlessWatcherResponse + 38, // 89: teleport.lib.teleterm.v1.TerminalService.ListDatabaseUsers:output_type -> teleport.lib.teleterm.v1.ListDatabaseUsersResponse + 46, // 90: teleport.lib.teleterm.v1.TerminalService.GetServers:output_type -> teleport.lib.teleterm.v1.GetServersResponse + 12, // 91: teleport.lib.teleterm.v1.TerminalService.GetAccessRequests:output_type -> teleport.lib.teleterm.v1.GetAccessRequestsResponse + 11, // 92: teleport.lib.teleterm.v1.TerminalService.GetAccessRequest:output_type -> teleport.lib.teleterm.v1.GetAccessRequestResponse + 3, // 93: teleport.lib.teleterm.v1.TerminalService.DeleteAccessRequest:output_type -> teleport.lib.teleterm.v1.EmptyResponse + 15, // 94: teleport.lib.teleterm.v1.TerminalService.CreateAccessRequest:output_type -> teleport.lib.teleterm.v1.CreateAccessRequestResponse + 20, // 95: teleport.lib.teleterm.v1.TerminalService.ReviewAccessRequest:output_type -> teleport.lib.teleterm.v1.ReviewAccessRequestResponse + 18, // 96: teleport.lib.teleterm.v1.TerminalService.GetRequestableRoles:output_type -> teleport.lib.teleterm.v1.GetRequestableRolesResponse + 3, // 97: teleport.lib.teleterm.v1.TerminalService.AssumeRole:output_type -> teleport.lib.teleterm.v1.EmptyResponse + 22, // 98: teleport.lib.teleterm.v1.TerminalService.PromoteAccessRequest:output_type -> teleport.lib.teleterm.v1.PromoteAccessRequestResponse + 24, // 99: teleport.lib.teleterm.v1.TerminalService.GetSuggestedAccessLists:output_type -> teleport.lib.teleterm.v1.GetSuggestedAccessListsResponse + 26, // 100: teleport.lib.teleterm.v1.TerminalService.ListKubernetesResources:output_type -> teleport.lib.teleterm.v1.ListKubernetesResourcesResponse + 90, // 101: teleport.lib.teleterm.v1.TerminalService.AddCluster:output_type -> teleport.lib.teleterm.v1.Cluster + 3, // 102: teleport.lib.teleterm.v1.TerminalService.RemoveCluster:output_type -> teleport.lib.teleterm.v1.EmptyResponse + 41, // 103: teleport.lib.teleterm.v1.TerminalService.ListGateways:output_type -> teleport.lib.teleterm.v1.ListGatewaysResponse + 91, // 104: teleport.lib.teleterm.v1.TerminalService.CreateGateway:output_type -> teleport.lib.teleterm.v1.Gateway + 3, // 105: teleport.lib.teleterm.v1.TerminalService.RemoveGateway:output_type -> teleport.lib.teleterm.v1.EmptyResponse + 91, // 106: teleport.lib.teleterm.v1.TerminalService.SetGatewayTargetSubresourceName:output_type -> teleport.lib.teleterm.v1.Gateway + 91, // 107: teleport.lib.teleterm.v1.TerminalService.SetGatewayLocalPort:output_type -> teleport.lib.teleterm.v1.Gateway + 102, // 108: teleport.lib.teleterm.v1.TerminalService.GetAuthSettings:output_type -> teleport.lib.teleterm.v1.AuthSettings + 90, // 109: teleport.lib.teleterm.v1.TerminalService.GetCluster:output_type -> teleport.lib.teleterm.v1.Cluster + 3, // 110: teleport.lib.teleterm.v1.TerminalService.Login:output_type -> teleport.lib.teleterm.v1.EmptyResponse + 28, // 111: teleport.lib.teleterm.v1.TerminalService.LoginPasswordless:output_type -> teleport.lib.teleterm.v1.LoginPasswordlessResponse + 3, // 112: teleport.lib.teleterm.v1.TerminalService.Logout:output_type -> teleport.lib.teleterm.v1.EmptyResponse + 31, // 113: teleport.lib.teleterm.v1.TerminalService.TransferFile:output_type -> teleport.lib.teleterm.v1.FileTransferProgress + 3, // 114: teleport.lib.teleterm.v1.TerminalService.ReportUsageEvent:output_type -> teleport.lib.teleterm.v1.EmptyResponse + 51, // 115: teleport.lib.teleterm.v1.TerminalService.UpdateHeadlessAuthenticationState:output_type -> teleport.lib.teleterm.v1.UpdateHeadlessAuthenticationStateResponse + 53, // 116: teleport.lib.teleterm.v1.TerminalService.CreateConnectMyComputerRole:output_type -> teleport.lib.teleterm.v1.CreateConnectMyComputerRoleResponse + 55, // 117: teleport.lib.teleterm.v1.TerminalService.CreateConnectMyComputerNodeToken:output_type -> teleport.lib.teleterm.v1.CreateConnectMyComputerNodeTokenResponse + 57, // 118: teleport.lib.teleterm.v1.TerminalService.WaitForConnectMyComputerNodeJoin:output_type -> teleport.lib.teleterm.v1.WaitForConnectMyComputerNodeJoinResponse + 59, // 119: teleport.lib.teleterm.v1.TerminalService.DeleteConnectMyComputerNode:output_type -> teleport.lib.teleterm.v1.DeleteConnectMyComputerNodeResponse + 61, // 120: teleport.lib.teleterm.v1.TerminalService.GetConnectMyComputerNodeName:output_type -> teleport.lib.teleterm.v1.GetConnectMyComputerNodeNameResponse + 64, // 121: teleport.lib.teleterm.v1.TerminalService.ListUnifiedResources:output_type -> teleport.lib.teleterm.v1.ListUnifiedResourcesResponse + 67, // 122: teleport.lib.teleterm.v1.TerminalService.GetUserPreferences:output_type -> teleport.lib.teleterm.v1.GetUserPreferencesResponse + 69, // 123: teleport.lib.teleterm.v1.TerminalService.UpdateUserPreferences:output_type -> teleport.lib.teleterm.v1.UpdateUserPreferencesResponse + 72, // 124: teleport.lib.teleterm.v1.TerminalService.AuthenticateWebDevice:output_type -> teleport.lib.teleterm.v1.AuthenticateWebDeviceResponse + 74, // 125: teleport.lib.teleterm.v1.TerminalService.GetApp:output_type -> teleport.lib.teleterm.v1.GetAppResponse + 77, // 126: teleport.lib.teleterm.v1.TerminalService.ConnectToDesktop:output_type -> teleport.lib.teleterm.v1.ConnectToDesktopResponse + 79, // 127: teleport.lib.teleterm.v1.TerminalService.AttachDirectoryToDesktopSession:output_type -> teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionResponse + 85, // [85:128] is the sub-list for method output_type + 42, // [42:85] is the sub-list for method input_type 42, // [42:42] is the sub-list for extension type_name 42, // [42:42] is the sub-list for extension extendee 0, // [0:42] is the sub-list for field type_name @@ -5134,7 +5246,7 @@ func file_teleport_lib_teleterm_v1_service_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_teleport_lib_teleterm_v1_service_proto_rawDesc), len(file_teleport_lib_teleterm_v1_service_proto_rawDesc)), NumEnums: 3, - NumMessages: 80, + NumMessages: 82, NumExtensions: 0, NumServices: 1, }, diff --git a/gen/proto/go/teleport/lib/teleterm/v1/service_grpc.pb.go b/gen/proto/go/teleport/lib/teleterm/v1/service_grpc.pb.go index eacaf31589bb2..2b10f6293289b 100644 --- a/gen/proto/go/teleport/lib/teleterm/v1/service_grpc.pb.go +++ b/gen/proto/go/teleport/lib/teleterm/v1/service_grpc.pb.go @@ -78,6 +78,7 @@ const ( TerminalService_AuthenticateWebDevice_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/AuthenticateWebDevice" TerminalService_GetApp_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/GetApp" TerminalService_ConnectToDesktop_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/ConnectToDesktop" + TerminalService_AttachDirectoryToDesktopSession_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/AttachDirectoryToDesktopSession" ) // TerminalServiceClient is the client API for TerminalService service. @@ -220,6 +221,13 @@ type TerminalServiceClient interface { GetApp(ctx context.Context, in *GetAppRequest, opts ...grpc.CallOption) (*GetAppResponse, error) // ConnectToDesktop is a bidirectional stream for the desktop connection. ConnectToDesktop(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[ConnectToDesktopRequest, ConnectToDesktopResponse], error) + // AttachDirectoryToDesktopSession opens a directory for a desktop session and enables file system operations for it. + // If there is no active desktop session associated with the specified desktop_uri and login, + // the RPC returns an error. + // + // This RPC does not automatically share the directory with the server (it does not send a SharedDirectoryAnnounce message). + // It only registers file system handlers for processing file system-related TDP events. + AttachDirectoryToDesktopSession(ctx context.Context, in *AttachDirectoryToDesktopSessionRequest, opts ...grpc.CallOption) (*AttachDirectoryToDesktopSessionResponse, error) } type terminalServiceClient struct { @@ -666,6 +674,16 @@ func (c *terminalServiceClient) ConnectToDesktop(ctx context.Context, opts ...gr // This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. type TerminalService_ConnectToDesktopClient = grpc.BidiStreamingClient[ConnectToDesktopRequest, ConnectToDesktopResponse] +func (c *terminalServiceClient) AttachDirectoryToDesktopSession(ctx context.Context, in *AttachDirectoryToDesktopSessionRequest, opts ...grpc.CallOption) (*AttachDirectoryToDesktopSessionResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(AttachDirectoryToDesktopSessionResponse) + err := c.cc.Invoke(ctx, TerminalService_AttachDirectoryToDesktopSession_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // TerminalServiceServer is the server API for TerminalService service. // All implementations must embed UnimplementedTerminalServiceServer // for forward compatibility. @@ -806,6 +824,13 @@ type TerminalServiceServer interface { GetApp(context.Context, *GetAppRequest) (*GetAppResponse, error) // ConnectToDesktop is a bidirectional stream for the desktop connection. ConnectToDesktop(grpc.BidiStreamingServer[ConnectToDesktopRequest, ConnectToDesktopResponse]) error + // AttachDirectoryToDesktopSession opens a directory for a desktop session and enables file system operations for it. + // If there is no active desktop session associated with the specified desktop_uri and login, + // the RPC returns an error. + // + // This RPC does not automatically share the directory with the server (it does not send a SharedDirectoryAnnounce message). + // It only registers file system handlers for processing file system-related TDP events. + AttachDirectoryToDesktopSession(context.Context, *AttachDirectoryToDesktopSessionRequest) (*AttachDirectoryToDesktopSessionResponse, error) mustEmbedUnimplementedTerminalServiceServer() } @@ -942,6 +967,9 @@ func (UnimplementedTerminalServiceServer) GetApp(context.Context, *GetAppRequest func (UnimplementedTerminalServiceServer) ConnectToDesktop(grpc.BidiStreamingServer[ConnectToDesktopRequest, ConnectToDesktopResponse]) error { return status.Errorf(codes.Unimplemented, "method ConnectToDesktop not implemented") } +func (UnimplementedTerminalServiceServer) AttachDirectoryToDesktopSession(context.Context, *AttachDirectoryToDesktopSessionRequest) (*AttachDirectoryToDesktopSessionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AttachDirectoryToDesktopSession not implemented") +} func (UnimplementedTerminalServiceServer) mustEmbedUnimplementedTerminalServiceServer() {} func (UnimplementedTerminalServiceServer) testEmbeddedByValue() {} @@ -1690,6 +1718,24 @@ func _TerminalService_ConnectToDesktop_Handler(srv interface{}, stream grpc.Serv // This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. type TerminalService_ConnectToDesktopServer = grpc.BidiStreamingServer[ConnectToDesktopRequest, ConnectToDesktopResponse] +func _TerminalService_AttachDirectoryToDesktopSession_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AttachDirectoryToDesktopSessionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TerminalServiceServer).AttachDirectoryToDesktopSession(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: TerminalService_AttachDirectoryToDesktopSession_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TerminalServiceServer).AttachDirectoryToDesktopSession(ctx, req.(*AttachDirectoryToDesktopSessionRequest)) + } + return interceptor(ctx, in, info, handler) +} + // TerminalService_ServiceDesc is the grpc.ServiceDesc for TerminalService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -1853,6 +1899,10 @@ var TerminalService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetApp", Handler: _TerminalService_GetApp_Handler, }, + { + MethodName: "AttachDirectoryToDesktopSession", + Handler: _TerminalService_AttachDirectoryToDesktopSession_Handler, + }, }, Streams: []grpc.StreamDesc{ { diff --git a/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.client.ts b/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.client.ts index d53cd99d91522..7165cf77fef08 100644 --- a/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.client.ts +++ b/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.client.ts @@ -24,6 +24,8 @@ import type { RpcTransport } from "@protobuf-ts/runtime-rpc"; import type { ServiceInfo } from "@protobuf-ts/runtime-rpc"; import { TerminalService } from "./service_pb"; +import type { AttachDirectoryToDesktopSessionResponse } from "./service_pb"; +import type { AttachDirectoryToDesktopSessionRequest } from "./service_pb"; import type { ConnectToDesktopResponse } from "./service_pb"; import type { ConnectToDesktopRequest } from "./service_pb"; import type { GetAppResponse } from "./service_pb"; @@ -411,6 +413,17 @@ export interface ITerminalServiceClient { * @generated from protobuf rpc: ConnectToDesktop(stream teleport.lib.teleterm.v1.ConnectToDesktopRequest) returns (stream teleport.lib.teleterm.v1.ConnectToDesktopResponse); */ connectToDesktop(options?: RpcOptions): DuplexStreamingCall; + /** + * AttachDirectoryToDesktopSession opens a directory for a desktop session and enables file system operations for it. + * If there is no active desktop session associated with the specified desktop_uri and login, + * the RPC returns an error. + * + * This RPC does not automatically share the directory with the server (it does not send a SharedDirectoryAnnounce message). + * It only registers file system handlers for processing file system-related TDP events. + * + * @generated from protobuf rpc: AttachDirectoryToDesktopSession(teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionRequest) returns (teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionResponse); + */ + attachDirectoryToDesktopSession(input: AttachDirectoryToDesktopSessionRequest, options?: RpcOptions): UnaryCall; } /** * TerminalService is used by the Electron app to communicate with the tsh daemon. @@ -851,4 +864,18 @@ export class TerminalServiceClient implements ITerminalServiceClient, ServiceInf const method = this.methods[41], opt = this._transport.mergeOptions(options); return stackIntercept("duplex", this._transport, method, opt); } + /** + * AttachDirectoryToDesktopSession opens a directory for a desktop session and enables file system operations for it. + * If there is no active desktop session associated with the specified desktop_uri and login, + * the RPC returns an error. + * + * This RPC does not automatically share the directory with the server (it does not send a SharedDirectoryAnnounce message). + * It only registers file system handlers for processing file system-related TDP events. + * + * @generated from protobuf rpc: AttachDirectoryToDesktopSession(teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionRequest) returns (teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionResponse); + */ + attachDirectoryToDesktopSession(input: AttachDirectoryToDesktopSessionRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[42], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } } diff --git a/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.grpc-server.ts b/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.grpc-server.ts index 533a756170162..3f2fca6c24949 100644 --- a/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.grpc-server.ts +++ b/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.grpc-server.ts @@ -21,6 +21,8 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . // +import { AttachDirectoryToDesktopSessionResponse } from "./service_pb"; +import { AttachDirectoryToDesktopSessionRequest } from "./service_pb"; import { ConnectToDesktopResponse } from "./service_pb"; import { ConnectToDesktopRequest } from "./service_pb"; import { GetAppResponse } from "./service_pb"; @@ -404,6 +406,17 @@ export interface ITerminalService extends grpc.UntypedServiceImplementation { * @generated from protobuf rpc: ConnectToDesktop(stream teleport.lib.teleterm.v1.ConnectToDesktopRequest) returns (stream teleport.lib.teleterm.v1.ConnectToDesktopResponse); */ connectToDesktop: grpc.handleBidiStreamingCall; + /** + * AttachDirectoryToDesktopSession opens a directory for a desktop session and enables file system operations for it. + * If there is no active desktop session associated with the specified desktop_uri and login, + * the RPC returns an error. + * + * This RPC does not automatically share the directory with the server (it does not send a SharedDirectoryAnnounce message). + * It only registers file system handlers for processing file system-related TDP events. + * + * @generated from protobuf rpc: AttachDirectoryToDesktopSession(teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionRequest) returns (teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionResponse); + */ + attachDirectoryToDesktopSession: grpc.handleUnaryCall; } /** * @grpc/grpc-js definition for the protobuf service teleport.lib.teleterm.v1.TerminalService. @@ -836,5 +849,15 @@ export const terminalServiceDefinition: grpc.ServiceDefinition requestDeserialize: bytes => ConnectToDesktopRequest.fromBinary(bytes), responseSerialize: value => Buffer.from(ConnectToDesktopResponse.toBinary(value)), requestSerialize: value => Buffer.from(ConnectToDesktopRequest.toBinary(value)) + }, + attachDirectoryToDesktopSession: { + path: "/teleport.lib.teleterm.v1.TerminalService/AttachDirectoryToDesktopSession", + originalName: "AttachDirectoryToDesktopSession", + requestStream: false, + responseStream: false, + responseDeserialize: bytes => AttachDirectoryToDesktopSessionResponse.fromBinary(bytes), + requestDeserialize: bytes => AttachDirectoryToDesktopSessionRequest.fromBinary(bytes), + responseSerialize: value => Buffer.from(AttachDirectoryToDesktopSessionResponse.toBinary(value)), + requestSerialize: value => Buffer.from(AttachDirectoryToDesktopSessionRequest.toBinary(value)) } }; diff --git a/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.ts b/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.ts index bfdc0c4f2b4a3..683cbe49c95ec 100644 --- a/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.ts +++ b/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.ts @@ -1256,6 +1256,38 @@ export interface ConnectToDesktopResponse { */ data: Uint8Array; } +/** + * Request for AttachDirectoryToDesktopSession. + * + * @generated from protobuf message teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionRequest + */ +export interface AttachDirectoryToDesktopSessionRequest { + /** + * URI of the desktop. + * + * @generated from protobuf field: string desktop_uri = 1; + */ + desktopUri: string; + /** + * Login for the desktop session. + * + * @generated from protobuf field: string login = 2; + */ + login: string; + /** + * Path to share with a remote machine. Must be a directory. + * + * @generated from protobuf field: string path = 3; + */ + path: string; +} +/** + * Response for AttachDirectoryToDesktopSession. + * + * @generated from protobuf message teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionResponse + */ +export interface AttachDirectoryToDesktopSessionResponse { +} /** * PasswordlessPrompt describes different prompts we need from users * during the passwordless login flow. @@ -5571,6 +5603,94 @@ class ConnectToDesktopResponse$Type extends MessageType { + constructor() { + super("teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionRequest", [ + { no: 1, name: "desktop_uri", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "login", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 3, name: "path", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): AttachDirectoryToDesktopSessionRequest { + const message = globalThis.Object.create((this.messagePrototype!)); + message.desktopUri = ""; + message.login = ""; + message.path = ""; + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: AttachDirectoryToDesktopSessionRequest): AttachDirectoryToDesktopSessionRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string desktop_uri */ 1: + message.desktopUri = reader.string(); + break; + case /* string login */ 2: + message.login = reader.string(); + break; + case /* string path */ 3: + message.path = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: AttachDirectoryToDesktopSessionRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string desktop_uri = 1; */ + if (message.desktopUri !== "") + writer.tag(1, WireType.LengthDelimited).string(message.desktopUri); + /* string login = 2; */ + if (message.login !== "") + writer.tag(2, WireType.LengthDelimited).string(message.login); + /* string path = 3; */ + if (message.path !== "") + writer.tag(3, WireType.LengthDelimited).string(message.path); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionRequest + */ +export const AttachDirectoryToDesktopSessionRequest = new AttachDirectoryToDesktopSessionRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class AttachDirectoryToDesktopSessionResponse$Type extends MessageType { + constructor() { + super("teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionResponse", []); + } + create(value?: PartialMessage): AttachDirectoryToDesktopSessionResponse { + const message = globalThis.Object.create((this.messagePrototype!)); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: AttachDirectoryToDesktopSessionResponse): AttachDirectoryToDesktopSessionResponse { + return target ?? this.create(); + } + internalBinaryWrite(message: AttachDirectoryToDesktopSessionResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionResponse + */ +export const AttachDirectoryToDesktopSessionResponse = new AttachDirectoryToDesktopSessionResponse$Type(); /** * @generated ServiceType for protobuf service teleport.lib.teleterm.v1.TerminalService */ @@ -5616,5 +5736,6 @@ export const TerminalService = new ServiceType("teleport.lib.teleterm.v1.Termina { name: "UpdateUserPreferences", options: {}, I: UpdateUserPreferencesRequest, O: UpdateUserPreferencesResponse }, { name: "AuthenticateWebDevice", options: {}, I: AuthenticateWebDeviceRequest, O: AuthenticateWebDeviceResponse }, { name: "GetApp", options: {}, I: GetAppRequest, O: GetAppResponse }, - { name: "ConnectToDesktop", serverStreaming: true, clientStreaming: true, options: {}, I: ConnectToDesktopRequest, O: ConnectToDesktopResponse } + { name: "ConnectToDesktop", serverStreaming: true, clientStreaming: true, options: {}, I: ConnectToDesktopRequest, O: ConnectToDesktopResponse }, + { name: "AttachDirectoryToDesktopSession", options: {}, I: AttachDirectoryToDesktopSessionRequest, O: AttachDirectoryToDesktopSessionResponse } ]); diff --git a/lib/teleterm/apiserver/handler/handler_desktops.go b/lib/teleterm/apiserver/handler/handler_desktops.go index 42cdd2af018de..467483649b5d6 100644 --- a/lib/teleterm/apiserver/handler/handler_desktops.go +++ b/lib/teleterm/apiserver/handler/handler_desktops.go @@ -17,6 +17,8 @@ package handler import ( + "context" + "github.com/gravitational/trace" "google.golang.org/grpc" @@ -61,6 +63,19 @@ func (s *Handler) ConnectToDesktop(stream grpc.BidiStreamingServer[api.ConnectTo return trace.Wrap(err) } - err = s.DaemonService.ConnectToDesktop(stream, parsed.GetClusterURI(), parsed.GetWindowsDesktopName(), login) + err = s.DaemonService.ConnectToDesktop(stream, parsed, parsed.GetWindowsDesktopName(), login) return trace.Wrap(err) } + +// AttachDirectoryToDesktopSession opens a directory for a desktop session and enables file system operations for it. +// If there is no active desktop session associated with the specified desktop_uri and login, +// an error is returned. +func (s *Handler) AttachDirectoryToDesktopSession(ctx context.Context, in *api.AttachDirectoryToDesktopSessionRequest) (*api.AttachDirectoryToDesktopSessionResponse, error) { + parsed, err := uri.Parse(in.GetDesktopUri()) + if err != nil { + return &api.AttachDirectoryToDesktopSessionResponse{}, trace.Wrap(err) + } + + err = s.DaemonService.AttachDirectoryToDesktopSession(ctx, parsed, in.GetLogin(), in.GetPath()) + return &api.AttachDirectoryToDesktopSessionResponse{}, trace.Wrap(err) +} diff --git a/lib/teleterm/daemon/daemon.go b/lib/teleterm/daemon/daemon.go index 53fa33b025572..fa5b75da36f7d 100644 --- a/lib/teleterm/daemon/daemon.go +++ b/lib/teleterm/daemon/daemon.go @@ -1241,6 +1241,18 @@ func (s *Service) ClearCachedClientsForRoot(clusterURI uri.ResourceURI) error { return trace.Wrap(s.clientCache.ClearForRoot(profileName)) } +// AttachDirectoryToDesktopSession opens a directory for a desktop session and enables file system operations for it. +// If there is no active desktop session associated with the specified desktop_uri and login, +// an error is returned. +func (s *Service) AttachDirectoryToDesktopSession(_ context.Context, desktopURI uri.ResourceURI, login, path string) error { + manager, err := s.desktopDirectorySharingManager.Get(desktop.TargetSession{DesktopURI: desktopURI, Login: login}) + if err != nil { + return trace.Wrap(err) + } + + return trace.Wrap(manager.Open(path)) +} + // Service is the daemon service type Service struct { cfg *Config diff --git a/proto/teleport/lib/teleterm/v1/service.proto b/proto/teleport/lib/teleterm/v1/service.proto index b8192f6fe5b66..f359340673923 100644 --- a/proto/teleport/lib/teleterm/v1/service.proto +++ b/proto/teleport/lib/teleterm/v1/service.proto @@ -185,6 +185,13 @@ service TerminalService { // ConnectToDesktop is a bidirectional stream for the desktop connection. rpc ConnectToDesktop(stream ConnectToDesktopRequest) returns (stream ConnectToDesktopResponse); + // AttachDirectoryToDesktopSession opens a directory for a desktop session and enables file system operations for it. + // If there is no active desktop session associated with the specified desktop_uri and login, + // the RPC returns an error. + // + // This RPC does not automatically share the directory with the server (it does not send a SharedDirectoryAnnounce message). + // It only registers file system handlers for processing file system-related TDP events. + rpc AttachDirectoryToDesktopSession(AttachDirectoryToDesktopSessionRequest) returns (AttachDirectoryToDesktopSessionResponse); } message EmptyResponse {} @@ -700,3 +707,16 @@ message ConnectToDesktopResponse { // Data is a TDP (Teleport Desktop Protocol) message sent from the desktop service to the client. bytes data = 1; } + +// Request for AttachDirectoryToDesktopSession. +message AttachDirectoryToDesktopSessionRequest { + // URI of the desktop. + string desktop_uri = 1; + // Login for the desktop session. + string login = 2; + // Path to share with a remote machine. Must be a directory. + string path = 3; +} + +// Response for AttachDirectoryToDesktopSession. +message AttachDirectoryToDesktopSessionResponse {} diff --git a/web/packages/teleterm/src/services/tshd/fixtures/mocks.ts b/web/packages/teleterm/src/services/tshd/fixtures/mocks.ts index a3a2443e8f6e0..fbfdc7e7ec1b8 100644 --- a/web/packages/teleterm/src/services/tshd/fixtures/mocks.ts +++ b/web/packages/teleterm/src/services/tshd/fixtures/mocks.ts @@ -116,6 +116,7 @@ export class MockTshClient implements TshdClient { startHeadlessWatcher = () => new MockedUnaryCall({}); getApp = () => new MockedUnaryCall({ app: makeApp() }); connectToDesktop = undefined; + attachDirectoryToDesktopSession = () => new MockedUnaryCall({}); } export class MockVnetClient implements VnetClient { From 22928dac1431c7a0d59b3c1c6fbfe047d0add5f5 Mon Sep 17 00:00:00 2001 From: Grzegorz Zdunek Date: Fri, 9 May 2025 13:16:59 +0200 Subject: [PATCH 03/14] Do not allow `attachDirectoryToDesktopSession` to be called from the renderer process --- web/packages/teleterm/src/preload.ts | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/web/packages/teleterm/src/preload.ts b/web/packages/teleterm/src/preload.ts index 95cb082291988..c1cb1266d4190 100644 --- a/web/packages/teleterm/src/preload.ts +++ b/web/packages/teleterm/src/preload.ts @@ -34,7 +34,11 @@ import { } from 'teleterm/services/grpcCredentials'; import { createFileLoggerService } from 'teleterm/services/logger'; import { createPtyService } from 'teleterm/services/pty/ptyService'; -import { createTshdClient, createVnetClient } from 'teleterm/services/tshd'; +import { + createTshdClient, + createVnetClient, + TshdClient, +} from 'teleterm/services/tshd'; import { loggingInterceptor } from 'teleterm/services/tshd/interceptors'; import { createTshdEventsServer } from 'teleterm/services/tshdEvents'; import { ElectronGlobals, RuntimeSettings } from 'teleterm/types'; @@ -67,7 +71,7 @@ async function getElectronGlobals(): Promise { channelCredentials: credentials.tshd, interceptors: [loggingInterceptor(new Logger('tshd'))], }); - const tshClient = createTshdClient(tshdTransport); + const tshClient = withoutInsecureTshdMethods(createTshdClient(tshdTransport)); const vnetClient = createVnetClient(tshdTransport); const ptyServiceClient = createPtyService( addresses.shared, @@ -164,3 +168,21 @@ async function withErrorLogging( throw e; } } + +/** + * Returns a copy of `TshdClient` with insecure methods disabled + * to prevent access from the untrusted renderer process. + * + * This is possible thanks to the context bridge and the `cloneClient` function, + * which selectively clones only RPC methods and nothing more. + * As a result, disabled methods are inaccessible via the `tshdClient` prototype. + */ +function withoutInsecureTshdMethods(client: TshdClient): TshdClient { + return { + ...client, + attachDirectoryToDesktopSession: () => { + // Prevent the renderer process from sharing directories at arbitrary paths. + throw new Error('This method is not permitted in the renderer process.'); + }, + }; +} From d7de5fa44098c013267477779cda2f658329127a Mon Sep 17 00:00:00 2001 From: Grzegorz Zdunek Date: Fri, 9 May 2025 13:17:55 +0200 Subject: [PATCH 04/14] Open the directory picker and send the selected path to tshd --- web/packages/teleterm/src/main.ts | 2 +- .../src/mainProcess/fixtures/mocks.ts | 4 + .../teleterm/src/mainProcess/mainProcess.ts | 44 ++++++-- .../src/mainProcess/mainProcessClient.ts | 9 ++ .../teleterm/src/mainProcess/types.ts | 12 +++ .../DocumentDesktopSession.tsx | 101 ++++++++++++++---- 6 files changed, 145 insertions(+), 27 deletions(-) diff --git a/web/packages/teleterm/src/main.ts b/web/packages/teleterm/src/main.ts index 7b0586265cb7c..3c49b98dee58f 100644 --- a/web/packages/teleterm/src/main.ts +++ b/web/packages/teleterm/src/main.ts @@ -155,7 +155,7 @@ async function initializeApp(): Promise { const rootClusterProxyHostAllowList = new Set(); (async () => { - const tshdClient = await mainProcess.initTshdClient(); + const tshdClient = await mainProcess.getTshdClient(); manageRootClusterProxyHostAllowList({ tshdClient, diff --git a/web/packages/teleterm/src/mainProcess/fixtures/mocks.ts b/web/packages/teleterm/src/mainProcess/fixtures/mocks.ts index 897da5871a469..c4f5c0b07db7e 100644 --- a/web/packages/teleterm/src/mainProcess/fixtures/mocks.ts +++ b/web/packages/teleterm/src/mainProcess/fixtures/mocks.ts @@ -173,6 +173,10 @@ export class MockMainProcessClient implements MainProcessClient { } refreshClusterList() {} + + async selectDirectoryForDesktopSession() { + return ''; + } } export const makeRuntimeSettings = ( diff --git a/web/packages/teleterm/src/mainProcess/mainProcess.ts b/web/packages/teleterm/src/mainProcess/mainProcess.ts index a2d465e5e75e4..2637870d62b35 100644 --- a/web/packages/teleterm/src/mainProcess/mainProcess.ts +++ b/web/packages/teleterm/src/mainProcess/mainProcess.ts @@ -109,6 +109,7 @@ export default class MainProcess { ) ); private readonly agentRunner: AgentRunner; + private tshdClient: Promise; private constructor(opts: Options) { this.settings = opts.settings; @@ -170,12 +171,18 @@ export default class MainProcess { } } - async initTshdClient(): Promise { - const { tsh: tshdAddress } = await this.resolvedChildProcessAddresses; - return setUpTshdClient({ - runtimeSettings: this.settings, - tshdAddress, - }); + async getTshdClient(): Promise { + if (!this.tshdClient) { + this.tshdClient = this.resolvedChildProcessAddresses.then( + ({ tsh: tshdAddress }) => + setUpTshdClient({ + runtimeSettings: this.settings, + tshdAddress, + }) + ); + } + + return this.tshdClient; } private initTshd() { @@ -562,6 +569,31 @@ export default class MainProcess { } ); + ipcMain.handle( + MainProcessIpc.SelectDirectoryForDesktopSession, + async (_, args: { desktopUri: string; login: string }) => { + const value = await dialog.showOpenDialog({ + properties: ['openDirectory'], + }); + if (value.canceled) { + throw new Error('Selecting directory canceled.'); + } + if (value.filePaths.length !== 1) { + throw new Error('No directory selected.'); + } + + const [dirPath] = value.filePaths; + const tshClient = await this.getTshdClient(); + await tshClient.attachDirectoryToDesktopSession({ + desktopUri: args.desktopUri, + login: args.login, + path: dirPath, + }); + + return path.basename(dirPath); + } + ); + subscribeToTerminalContextMenuEvent(this.configService); subscribeToTabContextMenuEvent( this.settings.availableShells, diff --git a/web/packages/teleterm/src/mainProcess/mainProcessClient.ts b/web/packages/teleterm/src/mainProcess/mainProcessClient.ts index 87717b884f4c2..67b21fd49507e 100644 --- a/web/packages/teleterm/src/mainProcess/mainProcessClient.ts +++ b/web/packages/teleterm/src/mainProcess/mainProcessClient.ts @@ -190,5 +190,14 @@ export default function createMainProcessClient(): MainProcessClient { refreshClusterList() { ipcRenderer.send(MainProcessIpc.RefreshClusterList); }, + selectDirectoryForDesktopSession(args: { + desktopUri: string; + login: string; + }) { + return ipcRenderer.invoke( + MainProcessIpc.SelectDirectoryForDesktopSession, + args + ); + }, }; } diff --git a/web/packages/teleterm/src/mainProcess/types.ts b/web/packages/teleterm/src/mainProcess/types.ts index 0cfd3905f3fc1..fda7d9c0bcba1 100644 --- a/web/packages/teleterm/src/mainProcess/types.ts +++ b/web/packages/teleterm/src/mainProcess/types.ts @@ -195,6 +195,17 @@ export type MainProcessClient = { */ signalUserInterfaceReadiness(args: { success: boolean }): void; refreshClusterList(): void; + /** + * Opens the Electron directory picker and sends the selected path to tshd through AttachDirectoryToDesktopSession. + * tshd then verifies whether there is an active session for the specified desktop user and attempts to open the directory. + * Once that's done, everything is ready on the tsh daemon to intercept and handle the file system events. + * + * Returns selected directory name. + */ + selectDirectoryForDesktopSession(args: { + desktopUri: string; + login: string; + }): Promise; }; export type ChildProcessAddresses = { @@ -310,6 +321,7 @@ export enum MainProcessIpc { VerifyConnectMyComputerAgent = 'main-process-connect-my-computer-verify-agent', SaveTextToFile = 'main-process-save-text-to-file', ForceFocusWindow = 'main-process-force-focus-window', + SelectDirectoryForDesktopSession = 'main-process-select-directory-for-desktop-session', } export enum WindowsManagerIpc { diff --git a/web/packages/teleterm/src/ui/DocumentDesktopSession/DocumentDesktopSession.tsx b/web/packages/teleterm/src/ui/DocumentDesktopSession/DocumentDesktopSession.tsx index df505037c7b8a..a17b95be95cf6 100644 --- a/web/packages/teleterm/src/ui/DocumentDesktopSession/DocumentDesktopSession.tsx +++ b/web/packages/teleterm/src/ui/DocumentDesktopSession/DocumentDesktopSession.tsx @@ -26,10 +26,11 @@ import { makeProcessingAttempt, makeSuccessAttempt, } from 'shared/hooks/useAsync'; -import { BrowserFileSystem, TdpClient, useListener } from 'shared/libs/tdp'; +import { SharedDirectoryAccess, TdpClient, useListener } from 'shared/libs/tdp'; import { TdpTransport } from 'shared/libs/tdp/client'; import Logger from 'teleterm/logger'; +import { MainProcessClient } from 'teleterm/mainProcess/types'; import { cloneAbortSignal, TshdClient } from 'teleterm/services/tshd'; import { useAppContext } from 'teleterm/ui/appContextProvider'; import Document from 'teleterm/ui/Document'; @@ -65,25 +66,28 @@ export function DocumentDesktopSession(props: { const [client] = useState( () => - new TdpClient(async abortSignal => { - const stream = appCtx.tshd.connectToDesktop({ - abort: cloneAbortSignal(abortSignal), - }); - appCtx.usageService.captureProtocolUse({ - uri: desktopUri, - protocol: 'desktop', - origin, - accessThrough: 'proxy_service', - }); - return adaptGRPCStreamToTdpTransport( - stream, - { - desktopUri, - login, - }, - logger - ); - }, new BrowserFileSystem()) + new TdpClient( + async abortSignal => { + const stream = appCtx.tshd.connectToDesktop({ + abort: cloneAbortSignal(abortSignal), + }); + appCtx.usageService.captureProtocolUse({ + uri: desktopUri, + protocol: 'desktop', + origin, + accessThrough: 'proxy_service', + }); + return adaptGRPCStreamToTdpTransport( + stream, + { desktopUri, login }, + logger + ); + }, + makeTshdFileSystem(appCtx.mainProcessClient, { + desktopUri, + login, + }) + ) ); useListener( @@ -170,3 +174,60 @@ async function adaptGRPCStreamToTdpTransport( }, }; } + +/** + * The tshd daemon is responsible for handling directory sharing. + * + * The process begins when the Electron main process opens a directory picker. + * Once a path is selected, it is passed to tshd via the AttachDirectoryToDesktopSession API. + * + * tshd then verifies whether there is an active session for the specified desktop user and attempts to open the directory. + * Once that's done, everything is ready on the tsh daemon to intercept and handle the file system events. + * + * The final step is to send a SharedDirectoryAnnounce message to the server, which is done in the JS TDP client. + * This message is safe to send from the renderer because it only provides + * a display name for the mounted drive on the remote machine and has no effect on local file system operations. + */ +function makeTshdFileSystem( + mainProcessClient: MainProcessClient, + target: { + desktopUri: string; + login: string; + } +): SharedDirectoryAccess { + let directoryName = ''; + return { + selectDirectory: async () => { + directoryName = + await mainProcessClient.selectDirectoryForDesktopSession(target); + }, + getDirectoryName: () => directoryName, + stat: () => { + throw new NotImplemented(); + }, + readDir: () => { + throw new NotImplemented(); + }, + read: () => { + throw new NotImplemented(); + }, + write: () => { + throw new NotImplemented(); + }, + truncate: () => { + throw new NotImplemented(); + }, + create: () => { + throw new NotImplemented(); + }, + delete: () => { + throw new NotImplemented(); + }, + }; +} + +class NotImplemented extends Error { + constructor() { + super('Not implemented, file system operation are handled by tsh demon.'); + } +} From 66e247622a5788a810a1a0618221dd1541e76db9 Mon Sep 17 00:00:00 2001 From: Grzegorz Zdunek Date: Fri, 9 May 2025 13:18:27 +0200 Subject: [PATCH 05/14] Intercept file system events coming from the server and handle them --- lib/teleterm/services/desktop/desktop.go | 204 ++++++++++++++++++++++- 1 file changed, 202 insertions(+), 2 deletions(-) diff --git a/lib/teleterm/services/desktop/desktop.go b/lib/teleterm/services/desktop/desktop.go index 8df386edefaa6..c6d024cad17ff 100644 --- a/lib/teleterm/services/desktop/desktop.go +++ b/lib/teleterm/services/desktop/desktop.go @@ -18,6 +18,8 @@ package desktop import ( "context" + "errors" + "os" "github.com/gravitational/trace" "google.golang.org/grpc" @@ -31,7 +33,7 @@ import ( ) // Connect starts a remote desktop session. -func Connect(ctx context.Context, stream grpc.BidiStreamingServer[api.ConnectToDesktopRequest, api.ConnectToDesktopResponse], clusterClient *client.TeleportClient, proxyClient *proxy.Client, desktopName, login string) error { +func Connect(ctx context.Context, stream grpc.BidiStreamingServer[api.ConnectToDesktopRequest, api.ConnectToDesktopResponse], clusterClient *client.TeleportClient, proxyClient *proxy.Client, desktopName, login string, directoryAccess *DirectoryAccess) error { keyRing, err := clusterClient.IssueUserCertsWithMFA(ctx, client.ReissueParams{ RouteToCluster: clusterClient.SiteName, TTL: clusterClient.KeyTTL, @@ -76,7 +78,24 @@ func Connect(ctx context.Context, stream grpc.BidiStreamingServer[api.ConnectToD return trace.Wrap(err) } - tdpConnProxy := tdp.NewConnProxy(downstreamRW, conn, nil) + interceptor := serverInterceptor{ + directoryAccess: directoryAccess, + } + + tdpConnProxy := tdp.NewConnProxy(downstreamRW, conn, func(tdpConn *tdp.Conn, message tdp.Message) (tdp.Message, error) { + msg, intErr := interceptor.process(message, func(message tdp.Message) error { + return trace.Wrap(tdpConn.WriteMessage(message)) + }) + if intErr != nil { + // Treat all file system errors as warnings, do not interrupt the connection. + return tdp.Alert{ + Message: intErr.Error(), + Severity: tdp.SeverityWarning, + }, nil + } + return msg, nil + }) + return trace.Wrap(tdpConnProxy.Run(ctx)) } @@ -107,3 +126,184 @@ func (d clientStream) Recv() ([]byte, error) { return data, nil } + +// serverInterceptor intercepts and processes messages sent from the server to the client. +type serverInterceptor struct { + directoryAccess *DirectoryAccess +} + +func (d *serverInterceptor) process(msg tdp.Message, sendToServer func(message tdp.Message) error) (tdp.Message, error) { + switch r := msg.(type) { + case tdp.SharedDirectoryInfoRequest: + return nil, trace.Wrap(d.handleSharedDirectoryInfoRequest(r, sendToServer)) + case tdp.SharedDirectoryListRequest: + return nil, trace.Wrap(d.handleSharedDirectoryListRequest(r, sendToServer)) + case tdp.SharedDirectoryReadRequest: + return nil, trace.Wrap(d.handleSharedDirectoryReadRequest(r, sendToServer)) + case tdp.SharedDirectoryMoveRequest: + return nil, trace.Wrap(d.handleSharedDirectoryMoveRequest(r, sendToServer)) + case tdp.SharedDirectoryWriteRequest: + return nil, trace.Wrap(d.handleSharedDirectoryWriteRequest(r, sendToServer)) + case tdp.SharedDirectoryTruncateRequest: + return nil, trace.Wrap(d.handleSharedDirectoryTruncateRequest(r, sendToServer)) + case tdp.SharedDirectoryCreateRequest: + return nil, trace.Wrap(d.handleSharedDirectoryCreateRequest(r, sendToServer)) + case tdp.SharedDirectoryDeleteRequest: + return nil, trace.Wrap(d.handleSharedDirectoryDeleteRequest(r, sendToServer)) + default: + return msg, nil + } +} + +type SharedDirectoryErrCode uint32 + +const ( + SharedDirectoryErrCodeNil SharedDirectoryErrCode = iota + SharedDirectoryErrCodeFailed + SharedDirectoryErrCodeDoesNotExist + SharedDirectoryErrCodeAlreadyExists +) + +func (d *serverInterceptor) handleSharedDirectoryInfoRequest(r tdp.SharedDirectoryInfoRequest, sendToServer func(message tdp.Message) error) error { + info, err := d.directoryAccess.Stat(r.Path) + if err == nil { + return trace.Wrap(sendToServer(tdp.SharedDirectoryInfoResponse{ + CompletionID: r.CompletionID, + ErrCode: uint32(SharedDirectoryErrCodeNil), + Fso: toFso(info), + })) + } + if errors.Is(err, os.ErrNotExist) { + return trace.Wrap(sendToServer(tdp.SharedDirectoryInfoResponse{ + CompletionID: r.CompletionID, + ErrCode: uint32(SharedDirectoryErrCodeDoesNotExist), + Fso: tdp.FileSystemObject{ + LastModified: 0, + Size: 0, + FileType: 0, + IsEmpty: 0, + Path: "", + }})) + } + return trace.Wrap(err) +} + +func (d *serverInterceptor) handleSharedDirectoryListRequest(r tdp.SharedDirectoryListRequest, sendToServer func(message tdp.Message) error) error { + contents, err := d.directoryAccess.ReadDir(r.Path) + if err != nil { + return trace.Wrap(err) + } + + fsoList := make([]tdp.FileSystemObject, len(contents)) + for i, content := range contents { + fsoList[i] = toFso(content) + } + + err = sendToServer(tdp.SharedDirectoryListResponse{ + CompletionID: r.CompletionID, + ErrCode: uint32(SharedDirectoryErrCodeNil), + FsoList: fsoList, + }) + return trace.Wrap(err) +} + +func (d *serverInterceptor) handleSharedDirectoryReadRequest(r tdp.SharedDirectoryReadRequest, sendToServer func(message tdp.Message) error) error { + contents, err := d.directoryAccess.Read(r.Path, int64(r.Offset), r.Length) + if err != nil { + return trace.Wrap(err) + } + + err = sendToServer(tdp.SharedDirectoryReadResponse{ + CompletionID: r.CompletionID, + ErrCode: uint32(SharedDirectoryErrCodeNil), + ReadDataLength: uint32(len(contents)), + ReadData: contents, + }) + return trace.Wrap(err) +} + +func (d *serverInterceptor) handleSharedDirectoryMoveRequest(r tdp.SharedDirectoryMoveRequest, sendToServer func(message tdp.Message) error) error { + err := sendToServer(tdp.SharedDirectoryMoveResponse{ + CompletionID: r.CompletionID, + ErrCode: uint32(SharedDirectoryErrCodeFailed), + }) + if err != nil { + return trace.Wrap(err) + } + + return trace.NotImplemented("Moving or renaming files and directories within a shared directory is not supported.") +} + +func (d *serverInterceptor) handleSharedDirectoryWriteRequest(r tdp.SharedDirectoryWriteRequest, sendToServer func(message tdp.Message) error) error { + bytesWritten, err := d.directoryAccess.Write(r.Path, int64(r.Offset), r.WriteData) + if err != nil { + return trace.Wrap(err) + } + + err = sendToServer(tdp.SharedDirectoryWriteResponse{ + CompletionID: r.CompletionID, + ErrCode: uint32(SharedDirectoryErrCodeNil), + BytesWritten: uint32(bytesWritten), + }) + return trace.Wrap(err) +} + +func (d *serverInterceptor) handleSharedDirectoryTruncateRequest(r tdp.SharedDirectoryTruncateRequest, sendToServer func(message tdp.Message) error) error { + err := d.directoryAccess.Truncate(r.Path, int64(r.EndOfFile)) + if err != nil { + return trace.Wrap(err) + } + + err = sendToServer(tdp.SharedDirectoryTruncateResponse{ + CompletionID: r.CompletionID, + ErrCode: uint32(SharedDirectoryErrCodeNil), + }) + return trace.Wrap(err) +} + +func (d *serverInterceptor) handleSharedDirectoryCreateRequest(r tdp.SharedDirectoryCreateRequest, sendToServer func(message tdp.Message) error) error { + err := d.directoryAccess.Create(r.Path, FileType(r.FileType)) + if err != nil { + return trace.Wrap(err) + } + + info, err := d.directoryAccess.Stat(r.Path) + if err != nil { + return trace.Wrap(err) + } + + err = sendToServer(tdp.SharedDirectoryCreateResponse{ + CompletionID: r.CompletionID, + ErrCode: uint32(SharedDirectoryErrCodeNil), + Fso: toFso(info), + }) + return trace.Wrap(err) +} + +func (d *serverInterceptor) handleSharedDirectoryDeleteRequest(r tdp.SharedDirectoryDeleteRequest, sendToServer func(message tdp.Message) error) error { + err := d.directoryAccess.Delete(r.Path) + if err != nil { + return trace.Wrap(err) + } + + err = sendToServer(tdp.SharedDirectoryDeleteResponse{ + CompletionID: r.CompletionID, + ErrCode: uint32(SharedDirectoryErrCodeNil), + }) + return trace.Wrap(err) +} + +func toFso(info *FileOrDirInfo) tdp.FileSystemObject { + obj := tdp.FileSystemObject{ + LastModified: uint64(info.LastModified), + Size: uint64(info.Size), + FileType: uint32(info.FileType), + IsEmpty: 1, + Path: info.Path, + } + if info.IsEmpty { + obj.IsEmpty = 0 + } + + return obj +} From 04dcc60788e18fb03bdb751a607992cc45596dbc Mon Sep 17 00:00:00 2001 From: Grzegorz Zdunek Date: Fri, 9 May 2025 13:37:35 +0200 Subject: [PATCH 06/14] Disallow file system messages to be sent from the renderer --- lib/teleterm/services/desktop/desktop.go | 31 ++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/lib/teleterm/services/desktop/desktop.go b/lib/teleterm/services/desktop/desktop.go index c6d024cad17ff..76724e3a04101 100644 --- a/lib/teleterm/services/desktop/desktop.go +++ b/lib/teleterm/services/desktop/desktop.go @@ -124,9 +124,40 @@ func (d clientStream) Recv() ([]byte, error) { return nil, trace.BadParameter("received invalid message") } + // Check if the message sent from the renderer is allowed. + decoded, err := tdp.Decode(data) + if err != nil { + return nil, trace.Wrap(err, "could not decode desktop message") + } + err = isClientMessageAllowed(decoded) + if err != nil { + return nil, trace.Wrap(err, "disallowed desktop message") + } + return data, nil } +// isClientMessageAllowed checks whether a message from the client is allowed +// to be forwarded to the server. +// +// Responses related to shared directory operations are handled exclusively +// by tshd and should not originate from the renderer process. +func isClientMessageAllowed(msg tdp.Message) error { + switch msg.(type) { + case tdp.SharedDirectoryInfoResponse, + tdp.SharedDirectoryCreateResponse, + tdp.SharedDirectoryDeleteResponse, + tdp.SharedDirectoryReadResponse, + tdp.SharedDirectoryWriteResponse, + tdp.SharedDirectoryMoveResponse, + tdp.SharedDirectoryListResponse, + tdp.SharedDirectoryTruncateResponse: + return trace.AccessDenied("file system messages are not allowed from the renderer process") + default: + return nil + } +} + // serverInterceptor intercepts and processes messages sent from the server to the client. type serverInterceptor struct { directoryAccess *DirectoryAccess From 8c742f7ced29fd31c4c603d1416fbfbb27ea6c87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Cie=C5=9Blak?= Date: Mon, 12 May 2025 15:19:08 +0200 Subject: [PATCH 07/14] Refactor dir sharing --- .../apiserver/handler/handler_desktops.go | 2 +- lib/teleterm/daemon/daemon.go | 83 ++++++++--- lib/teleterm/services/desktop/desktop.go | 132 +++++++++++++++--- lib/teleterm/services/desktop/desktop_test.go | 46 ++++++ .../services/desktop/directorysharing.go | 61 -------- .../services/desktop/directorysharing_test.go | 44 ------ 6 files changed, 224 insertions(+), 144 deletions(-) create mode 100644 lib/teleterm/services/desktop/desktop_test.go diff --git a/lib/teleterm/apiserver/handler/handler_desktops.go b/lib/teleterm/apiserver/handler/handler_desktops.go index 467483649b5d6..86a9206a01d94 100644 --- a/lib/teleterm/apiserver/handler/handler_desktops.go +++ b/lib/teleterm/apiserver/handler/handler_desktops.go @@ -63,7 +63,7 @@ func (s *Handler) ConnectToDesktop(stream grpc.BidiStreamingServer[api.ConnectTo return trace.Wrap(err) } - err = s.DaemonService.ConnectToDesktop(stream, parsed, parsed.GetWindowsDesktopName(), login) + err = s.DaemonService.ConnectToDesktop(stream, parsed, login) return trace.Wrap(err) } diff --git a/lib/teleterm/daemon/daemon.go b/lib/teleterm/daemon/daemon.go index fa5b75da36f7d..678cf5ab6db94 100644 --- a/lib/teleterm/daemon/daemon.go +++ b/lib/teleterm/daemon/daemon.go @@ -84,14 +84,14 @@ func New(cfg Config) (*Service, error) { go connectUsageReporter.Run(closeContext) service := &Service{ - cfg: &cfg, - closeContext: closeContext, - cancel: cancel, - gateways: make(map[string]gateway.Gateway), - usageReporter: connectUsageReporter, - headlessWatcherClosers: make(map[string]context.CancelFunc), - headlessAuthSemaphore: newWaitSemaphore(maxConcurrentImportantModals, imporantModalWaitDuraiton), - desktopDirectorySharingManager: desktop.NewDirectorySharingManager(), + cfg: &cfg, + closeContext: closeContext, + cancel: cancel, + gateways: make(map[string]gateway.Gateway), + desktopSessions: make(map[string]*desktop.Session), + usageReporter: connectUsageReporter, + headlessWatcherClosers: make(map[string]context.CancelFunc), + headlessAuthSemaphore: newWaitSemaphore(maxConcurrentImportantModals, imporantModalWaitDuraiton), } // TODO(gzdunek): The client cache should be created outside of daemon.New. @@ -210,10 +210,10 @@ func (s *Service) AddCluster(ctx context.Context, webProxyAddress string) (*clus } // ConnectToDesktop establishes a desktop connection. -func (s *Service) ConnectToDesktop(stream grpc.BidiStreamingServer[api.ConnectToDesktopRequest, api.ConnectToDesktopResponse], uri uri.ResourceURI, desktopName, login string) error { +func (s *Service) ConnectToDesktop(stream grpc.BidiStreamingServer[api.ConnectToDesktopRequest, api.ConnectToDesktopResponse], desktopURI uri.ResourceURI, login string) error { ctx := stream.Context() - cluster, clusterClient, err := s.ResolveClusterURI(uri) + cluster, clusterClient, err := s.ResolveClusterURI(desktopURI) if err != nil { return trace.Wrap(err) } @@ -223,18 +223,50 @@ func (s *Service) ConnectToDesktop(stream grpc.BidiStreamingServer[api.ConnectTo return trace.Wrap(err) } - dir, unregister, err := s.desktopDirectorySharingManager.Register(desktop.TargetSession{DesktopURI: uri, Login: login}) + session, cleanup, err := s.newDesktopSession(desktopURI, login) if err != nil { return trace.Wrap(err) } - defer unregister() + defer cleanup() err = clusters.AddMetadataToRetryableError(ctx, func() error { - return trace.Wrap(desktop.Connect(ctx, stream, clusterClient, cachedClient.ProxyClient, desktopName, login, dir)) + return trace.Wrap(session.Start(ctx, stream, clusterClient, cachedClient.ProxyClient)) }) return trace.Wrap(err) } +// newDesktopSession creates a new desktop session for the specified desktop URI and login. +// +// If a session already exists for the given desktop URI and login, it returns an error. +// On success, it returns the created session and a cleanup function that should be called to remove +// the session from the service when it is no longer used. +func (s *Service) newDesktopSession(desktopURI uri.ResourceURI, login string) (*desktop.Session, func(), error) { + s.desktopSessionsMu.Lock() + defer s.desktopSessionsMu.Unlock() + + key := desktopSessionKey(desktopURI, login) + + if _, ok := s.desktopSessions[key]; ok { + return nil, nil, trace.AlreadyExists("session for desktop %q and login %q already exists", desktopURI, login) + } + + session, err := desktop.NewSession(desktopURI, login) + if err != nil { + return nil, nil, trace.Wrap(err) + } + + s.desktopSessions[key] = session + + cleanup := func() { + s.desktopSessionsMu.Lock() + defer s.desktopSessionsMu.Unlock() + + delete(s.desktopSessions, key) + } + + return session, cleanup, nil +} + // RemoveCluster removes cluster func (s *Service) RemoveCluster(ctx context.Context, uri string) error { cluster, _, err := s.ResolveCluster(uri) @@ -1245,12 +1277,20 @@ func (s *Service) ClearCachedClientsForRoot(clusterURI uri.ResourceURI) error { // If there is no active desktop session associated with the specified desktop_uri and login, // an error is returned. func (s *Service) AttachDirectoryToDesktopSession(_ context.Context, desktopURI uri.ResourceURI, login, path string) error { - manager, err := s.desktopDirectorySharingManager.Get(desktop.TargetSession{DesktopURI: desktopURI, Login: login}) - if err != nil { - return trace.Wrap(err) + s.desktopSessionsMu.Lock() + defer s.desktopSessionsMu.Unlock() + + session, ok := s.desktopSessions[desktopSessionKey(desktopURI, login)] + if !ok { + return trace.BadParameter("there is no desktop session for desktop %s and login %q", desktopURI, login) } - return trace.Wrap(manager.Open(path)) + err := session.AttachSharedDirectory(path) + return trace.Wrap(err) +} + +func desktopSessionKey(desktopURI uri.ResourceURI, login string) string { + return desktopURI.String() + "-" + login } // Service is the daemon service @@ -1268,6 +1308,13 @@ type Service struct { // gatewaysMu guards gateways. gatewaysMu sync.RWMutex + // desktopSessions maps a desktop key (derived from desktop URI and login) to desktop sessions. + // + // Each session is created by the ConnectToDesktop RPC and later used by the AttachDirectoryToDesktopSession RPC + // to share a directory within the session. + desktopSessions map[string]*desktop.Session + desktopSessionsMu sync.Mutex + // The Electron App can display multiple important modals by showing the latest one and hiding the others. // However, we should be careful with it, and generally try to limit the number of prompts on the tshd side, // to avoid flooding the app. @@ -1297,8 +1344,6 @@ type Service struct { headlessWatcherClosers map[string]context.CancelFunc headlessWatcherClosersMu sync.Mutex clientCache ClientCache - - desktopDirectorySharingManager *desktop.DirectorySharingManager } type CreateGatewayParams struct { diff --git a/lib/teleterm/services/desktop/desktop.go b/lib/teleterm/services/desktop/desktop.go index 76724e3a04101..5d6ea33bfad3d 100644 --- a/lib/teleterm/services/desktop/desktop.go +++ b/lib/teleterm/services/desktop/desktop.go @@ -20,6 +20,7 @@ import ( "context" "errors" "os" + "sync" "github.com/gravitational/trace" "google.golang.org/grpc" @@ -30,23 +31,81 @@ import ( api "github.com/gravitational/teleport/gen/proto/go/teleport/lib/teleterm/v1" "github.com/gravitational/teleport/lib/client" "github.com/gravitational/teleport/lib/srv/desktop/tdp" + "github.com/gravitational/teleport/lib/teleterm/api/uri" ) -// Connect starts a remote desktop session. -func Connect(ctx context.Context, stream grpc.BidiStreamingServer[api.ConnectToDesktopRequest, api.ConnectToDesktopResponse], clusterClient *client.TeleportClient, proxyClient *proxy.Client, desktopName, login string, directoryAccess *DirectoryAccess) error { +// Session uniquely describes a desktop session. +// There can be only one session for the given desktop and login pair. +type Session struct { + desktopURI uri.ResourceURI + login string + + dirAccess *DirectoryAccess + dirAccessMu sync.RWMutex +} + +// NewSession initializes a Session struct for a given desktop and login. +func NewSession(desktopURI uri.ResourceURI, login string) (*Session, error) { + if desktopURI.GetWindowsDesktopName() == "" { + return nil, trace.BadParameter("invalid desktop URI %q", desktopURI) + } + if login == "" { + return nil, trace.BadParameter("login cannot be empty") + } + + return &Session{ + desktopURI: desktopURI, + login: login, + }, nil +} + +func (s *Session) desktopName() string { + return s.desktopURI.GetWindowsDesktopName() +} + +func (s *Session) AttachSharedDirectory(basePath string) error { + s.dirAccessMu.Lock() + defer s.dirAccessMu.Unlock() + + if s.dirAccess != nil { + return trace.AlreadyExists("directory is already shared for desktop %q and login", s.desktopName(), s.login) + } + + dirAccess, err := NewDirectoryAccess(basePath) + if err != nil { + return trace.Wrap(err) + } + s.dirAccess = dirAccess + + return nil +} + +func (s *Session) GetDirectoryAccess() (*DirectoryAccess, error) { + s.dirAccessMu.RLock() + s.dirAccessMu.RUnlock() + + if s.dirAccess == nil { + return nil, trace.NotFound("directory sharing has not been initialized for desktop %q and login %q", s.desktopName(), s.login) + } + + return s.dirAccess, nil +} + +// Start starts a remote desktop session. +func (s *Session) Start(ctx context.Context, stream grpc.BidiStreamingServer[api.ConnectToDesktopRequest, api.ConnectToDesktopResponse], clusterClient *client.TeleportClient, proxyClient *proxy.Client) error { keyRing, err := clusterClient.IssueUserCertsWithMFA(ctx, client.ReissueParams{ RouteToCluster: clusterClient.SiteName, TTL: clusterClient.KeyTTL, RouteToWindowsDesktop: proto.RouteToWindowsDesktop{ - WindowsDesktop: desktopName, - Login: login, + WindowsDesktop: s.desktopName(), + Login: s.login, }, }) if err != nil { return trace.Wrap(err) } - cert, err := keyRing.WindowsDesktopTLSCert(desktopName) + cert, err := keyRing.WindowsDesktopTLSCert(s.desktopName()) if err != nil { return trace.Wrap(err) } @@ -56,7 +115,7 @@ func Connect(ctx context.Context, stream grpc.BidiStreamingServer[api.ConnectToD return trace.Wrap(err) } - conn, err := proxyClient.ProxyWindowsDesktopSession(ctx, clusterClient.SiteName, desktopName, cert, tlsConfig.RootCAs) + conn, err := proxyClient.ProxyWindowsDesktopSession(ctx, clusterClient.SiteName, s.desktopName(), cert, tlsConfig.RootCAs) if err != nil { return trace.Wrap(err) } @@ -66,7 +125,7 @@ func Connect(ctx context.Context, stream grpc.BidiStreamingServer[api.ConnectToD // send the username. tdpConn := tdp.NewConn(conn) defer tdpConn.Close() - err = tdpConn.WriteMessage(tdp.ClientUsername{Username: login}) + err = tdpConn.WriteMessage(tdp.ClientUsername{Username: s.login}) if err != nil { return trace.Wrap(err) } @@ -79,7 +138,7 @@ func Connect(ctx context.Context, stream grpc.BidiStreamingServer[api.ConnectToD } interceptor := serverInterceptor{ - directoryAccess: directoryAccess, + directoryAccessProvider: s, } tdpConnProxy := tdp.NewConnProxy(downstreamRW, conn, func(tdpConn *tdp.Conn, message tdp.Message) (tdp.Message, error) { @@ -160,7 +219,11 @@ func isClientMessageAllowed(msg tdp.Message) error { // serverInterceptor intercepts and processes messages sent from the server to the client. type serverInterceptor struct { - directoryAccess *DirectoryAccess + directoryAccessProvider directoryAccessProvider +} + +type directoryAccessProvider interface { + GetDirectoryAccess() (*DirectoryAccess, error) } func (d *serverInterceptor) process(msg tdp.Message, sendToServer func(message tdp.Message) error) (tdp.Message, error) { @@ -196,7 +259,12 @@ const ( ) func (d *serverInterceptor) handleSharedDirectoryInfoRequest(r tdp.SharedDirectoryInfoRequest, sendToServer func(message tdp.Message) error) error { - info, err := d.directoryAccess.Stat(r.Path) + dirAccess, err := d.directoryAccessProvider.GetDirectoryAccess() + if err != nil { + return trace.Wrap(err) + } + + info, err := dirAccess.Stat(r.Path) if err == nil { return trace.Wrap(sendToServer(tdp.SharedDirectoryInfoResponse{ CompletionID: r.CompletionID, @@ -220,7 +288,11 @@ func (d *serverInterceptor) handleSharedDirectoryInfoRequest(r tdp.SharedDirecto } func (d *serverInterceptor) handleSharedDirectoryListRequest(r tdp.SharedDirectoryListRequest, sendToServer func(message tdp.Message) error) error { - contents, err := d.directoryAccess.ReadDir(r.Path) + dirAccess, err := d.directoryAccessProvider.GetDirectoryAccess() + if err != nil { + return trace.Wrap(err) + } + contents, err := dirAccess.ReadDir(r.Path) if err != nil { return trace.Wrap(err) } @@ -239,7 +311,13 @@ func (d *serverInterceptor) handleSharedDirectoryListRequest(r tdp.SharedDirecto } func (d *serverInterceptor) handleSharedDirectoryReadRequest(r tdp.SharedDirectoryReadRequest, sendToServer func(message tdp.Message) error) error { - contents, err := d.directoryAccess.Read(r.Path, int64(r.Offset), r.Length) + dirAccess, err := d.directoryAccessProvider.GetDirectoryAccess() + if err != nil { + return trace.Wrap(err) + } + + buf := make([]byte, r.Length) + n, err := dirAccess.Read(r.Path, int64(r.Offset), buf) if err != nil { return trace.Wrap(err) } @@ -247,8 +325,8 @@ func (d *serverInterceptor) handleSharedDirectoryReadRequest(r tdp.SharedDirecto err = sendToServer(tdp.SharedDirectoryReadResponse{ CompletionID: r.CompletionID, ErrCode: uint32(SharedDirectoryErrCodeNil), - ReadDataLength: uint32(len(contents)), - ReadData: contents, + ReadDataLength: uint32(n), + ReadData: buf[:n], }) return trace.Wrap(err) } @@ -266,7 +344,11 @@ func (d *serverInterceptor) handleSharedDirectoryMoveRequest(r tdp.SharedDirecto } func (d *serverInterceptor) handleSharedDirectoryWriteRequest(r tdp.SharedDirectoryWriteRequest, sendToServer func(message tdp.Message) error) error { - bytesWritten, err := d.directoryAccess.Write(r.Path, int64(r.Offset), r.WriteData) + dirAccess, err := d.directoryAccessProvider.GetDirectoryAccess() + if err != nil { + return trace.Wrap(err) + } + bytesWritten, err := dirAccess.Write(r.Path, int64(r.Offset), r.WriteData) if err != nil { return trace.Wrap(err) } @@ -280,7 +362,11 @@ func (d *serverInterceptor) handleSharedDirectoryWriteRequest(r tdp.SharedDirect } func (d *serverInterceptor) handleSharedDirectoryTruncateRequest(r tdp.SharedDirectoryTruncateRequest, sendToServer func(message tdp.Message) error) error { - err := d.directoryAccess.Truncate(r.Path, int64(r.EndOfFile)) + dirAccess, err := d.directoryAccessProvider.GetDirectoryAccess() + if err != nil { + return trace.Wrap(err) + } + err = dirAccess.Truncate(r.Path, int64(r.EndOfFile)) if err != nil { return trace.Wrap(err) } @@ -293,12 +379,16 @@ func (d *serverInterceptor) handleSharedDirectoryTruncateRequest(r tdp.SharedDir } func (d *serverInterceptor) handleSharedDirectoryCreateRequest(r tdp.SharedDirectoryCreateRequest, sendToServer func(message tdp.Message) error) error { - err := d.directoryAccess.Create(r.Path, FileType(r.FileType)) + dirAccess, err := d.directoryAccessProvider.GetDirectoryAccess() + if err != nil { + return trace.Wrap(err) + } + err = dirAccess.Create(r.Path, FileType(r.FileType)) if err != nil { return trace.Wrap(err) } - info, err := d.directoryAccess.Stat(r.Path) + info, err := dirAccess.Stat(r.Path) if err != nil { return trace.Wrap(err) } @@ -312,7 +402,11 @@ func (d *serverInterceptor) handleSharedDirectoryCreateRequest(r tdp.SharedDirec } func (d *serverInterceptor) handleSharedDirectoryDeleteRequest(r tdp.SharedDirectoryDeleteRequest, sendToServer func(message tdp.Message) error) error { - err := d.directoryAccess.Delete(r.Path) + dirAccess, err := d.directoryAccessProvider.GetDirectoryAccess() + if err != nil { + return trace.Wrap(err) + } + err = dirAccess.Delete(r.Path) if err != nil { return trace.Wrap(err) } diff --git a/lib/teleterm/services/desktop/desktop_test.go b/lib/teleterm/services/desktop/desktop_test.go new file mode 100644 index 0000000000000..39c4afed484ec --- /dev/null +++ b/lib/teleterm/services/desktop/desktop_test.go @@ -0,0 +1,46 @@ +package desktop + +import ( + "path/filepath" + "testing" + + "github.com/gravitational/trace" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/lib/teleterm/api/uri" +) + +var desktopURI = uri.NewClusterURI("foo").AppendWindowsDesktop("bar") +var login = "admin" + +func TestAttachDirectory(t *testing.T) { + path := t.TempDir() + session, err := NewSession(desktopURI, login) + require.NoError(t, err) + + // Clean state, share the directory. + err = session.AttachSharedDirectory(path) + require.NoError(t, err) + + // Attempt to share another directory. + err = session.AttachSharedDirectory("any_path") + require.True(t, trace.IsAlreadyExists(err)) +} + +func TestGetDirectory(t *testing.T) { + path := t.TempDir() + session, err := NewSession(desktopURI, login) + require.NoError(t, err) + + _, err = session.GetDirectoryAccess() + require.True(t, trace.IsNotFound(err)) + + err = session.AttachSharedDirectory(path) + require.NoError(t, err) + + access, err := session.GetDirectoryAccess() + require.NoError(t, err) + resolvedPath, err := filepath.EvalSymlinks(path) + require.NoError(t, err) + require.Equal(t, resolvedPath, access.basePath) +} diff --git a/lib/teleterm/services/desktop/directorysharing.go b/lib/teleterm/services/desktop/directorysharing.go index 1cb3153e2e52b..4daaed5f36988 100644 --- a/lib/teleterm/services/desktop/directorysharing.go +++ b/lib/teleterm/services/desktop/directorysharing.go @@ -23,71 +23,10 @@ import ( "os" "path/filepath" "strings" - "sync" "github.com/gravitational/trace" - - "github.com/gravitational/teleport/lib/teleterm/api/uri" ) -// DirectorySharingManager coordinates access to shared directories across multiple desktop sessions. -type DirectorySharingManager struct { - directories map[TargetSession]*DirectoryAccess - mu sync.Mutex -} - -// NewDirectorySharingManager initializes DirectorySharingManager. -func NewDirectorySharingManager() *DirectorySharingManager { - return &DirectorySharingManager{ - directories: make(map[TargetSession]*DirectoryAccess), - } -} - -// TargetSession uniquely describes a desktop session. -// There can be only one session for the given desktop and login pair. -type TargetSession struct { - DesktopURI uri.ResourceURI - Login string -} - -// Register initializes shared directory access for given desktop session. -// When the session ends, it should unregister the directory access for it. -// Registering dir access for the same session without unregistering it first, is not allowed. -func (g *DirectorySharingManager) Register(session TargetSession) (access *DirectoryAccess, unregister func(), err error) { - g.mu.Lock() - defer g.mu.Unlock() - - access, ok := g.directories[session] - if ok { - return nil, nil, trace.AlreadyExists("directory access for %v is already registered", session) - } - access = &DirectoryAccess{} - g.directories[session] = access - - unregister = func() { - g.mu.Lock() - defer g.mu.Unlock() - - delete(g.directories, session) - } - - return access, unregister, nil -} - -// Get returns the directory access for the given session. -// It must be registered by the desktop session first. -func (g *DirectorySharingManager) Get(target TargetSession) (*DirectoryAccess, error) { - g.mu.Lock() - defer g.mu.Unlock() - - manager, ok := g.directories[target] - if !ok { - return nil, trace.NotFound("directory sharing has not been initialized for desktop %q and login %q", target.DesktopURI, target.Login) - } - - return manager, nil -} - // DirectoryAccess enables file system operations for a given directory. // Should be kept in sync with web/packages/shared/libs/tdp/sharedDirectoryAccess.ts // where FS events are handled for Web UI. diff --git a/lib/teleterm/services/desktop/directorysharing_test.go b/lib/teleterm/services/desktop/directorysharing_test.go index 21a11e3fffa1e..8fe3ec906f22a 100644 --- a/lib/teleterm/services/desktop/directorysharing_test.go +++ b/lib/teleterm/services/desktop/directorysharing_test.go @@ -23,52 +23,8 @@ import ( "github.com/gravitational/trace" "github.com/stretchr/testify/require" - - "github.com/gravitational/teleport/lib/teleterm/api/uri" ) -var targetDesktop = TargetSession{ - DesktopURI: uri.NewClusterURI("foo").AppendWindowsDesktop("bar"), - Login: "admin", -} - -func TestRegisterSharedDirectory(t *testing.T) { - manager := NewDirectorySharingManager() - - // Clean state, register the first handler. - _, unregister, err := manager.Register(targetDesktop) - require.NoError(t, err) - // Remove the registered handler. - unregister() - - // Register the handler again. - _, unregister, err = manager.Register(targetDesktop) - require.NoError(t, err) - // Do not unregister it immediately. - defer unregister() - - // Try to register the handler again, it should return the error. - _, _, err = manager.Register(targetDesktop) - require.True(t, trace.IsAlreadyExists(err)) -} - -func TestGetSharedDirectory(t *testing.T) { - manager := NewDirectorySharingManager() - - _, unregister, err := manager.Register(targetDesktop) - require.NoError(t, err) - - access, err := manager.Get(targetDesktop) - require.NoError(t, err) - require.NotNil(t, access) - - // Remove the registered handler. - unregister() - - _, err = manager.Get(targetDesktop) - require.True(t, trace.IsNotFound(err)) -} - func TestOpenSharedDirectory(t *testing.T) { path := t.TempDir() filePath := filepath.Join(path, testFilename) From c1771ee9588b9b3e773484f8910d9da1c53cc1c8 Mon Sep 17 00:00:00 2001 From: Grzegorz Zdunek Date: Tue, 13 May 2025 11:09:43 +0200 Subject: [PATCH 08/14] `AttachDirectoryToDesktopSession` -> `SetSharedDirectoryForDesktopSession` --- .../go/teleport/lib/teleterm/v1/service.pb.go | 64 +++++----- .../lib/teleterm/v1/service_grpc.pb.go | 118 +++++++++--------- .../lib/teleterm/v1/service_pb.client.ts | 18 +-- .../lib/teleterm/v1/service_pb.grpc-server.ts | 24 ++-- .../ts/teleport/lib/teleterm/v1/service_pb.ts | 46 +++---- .../apiserver/handler/handler_desktops.go | 10 +- lib/teleterm/daemon/daemon.go | 8 +- lib/teleterm/services/desktop/desktop.go | 2 +- lib/teleterm/services/desktop/desktop_test.go | 8 +- proto/teleport/lib/teleterm/v1/service.proto | 12 +- .../teleterm/src/mainProcess/mainProcess.ts | 2 +- .../teleterm/src/mainProcess/types.ts | 2 +- web/packages/teleterm/src/preload.ts | 2 +- .../src/services/tshd/fixtures/mocks.ts | 2 +- .../DocumentDesktopSession.tsx | 2 +- 15 files changed, 160 insertions(+), 160 deletions(-) diff --git a/gen/proto/go/teleport/lib/teleterm/v1/service.pb.go b/gen/proto/go/teleport/lib/teleterm/v1/service.pb.go index 3cb6b645d09ac..15cc7c4a6353e 100644 --- a/gen/proto/go/teleport/lib/teleterm/v1/service.pb.go +++ b/gen/proto/go/teleport/lib/teleterm/v1/service.pb.go @@ -4252,8 +4252,8 @@ func (x *ConnectToDesktopResponse) GetData() []byte { return nil } -// Request for AttachDirectoryToDesktopSession. -type AttachDirectoryToDesktopSessionRequest struct { +// Request for SetSharedDirectoryForDesktopSession. +type SetSharedDirectoryForDesktopSessionRequest struct { state protoimpl.MessageState `protogen:"open.v1"` // URI of the desktop. DesktopUri string `protobuf:"bytes,1,opt,name=desktop_uri,json=desktopUri,proto3" json:"desktop_uri,omitempty"` @@ -4265,20 +4265,20 @@ type AttachDirectoryToDesktopSessionRequest struct { sizeCache protoimpl.SizeCache } -func (x *AttachDirectoryToDesktopSessionRequest) Reset() { - *x = AttachDirectoryToDesktopSessionRequest{} +func (x *SetSharedDirectoryForDesktopSessionRequest) Reset() { + *x = SetSharedDirectoryForDesktopSessionRequest{} mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *AttachDirectoryToDesktopSessionRequest) String() string { +func (x *SetSharedDirectoryForDesktopSessionRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AttachDirectoryToDesktopSessionRequest) ProtoMessage() {} +func (*SetSharedDirectoryForDesktopSessionRequest) ProtoMessage() {} -func (x *AttachDirectoryToDesktopSessionRequest) ProtoReflect() protoreflect.Message { +func (x *SetSharedDirectoryForDesktopSessionRequest) ProtoReflect() protoreflect.Message { mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[75] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4290,53 +4290,53 @@ func (x *AttachDirectoryToDesktopSessionRequest) ProtoReflect() protoreflect.Mes return mi.MessageOf(x) } -// Deprecated: Use AttachDirectoryToDesktopSessionRequest.ProtoReflect.Descriptor instead. -func (*AttachDirectoryToDesktopSessionRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use SetSharedDirectoryForDesktopSessionRequest.ProtoReflect.Descriptor instead. +func (*SetSharedDirectoryForDesktopSessionRequest) Descriptor() ([]byte, []int) { return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{75} } -func (x *AttachDirectoryToDesktopSessionRequest) GetDesktopUri() string { +func (x *SetSharedDirectoryForDesktopSessionRequest) GetDesktopUri() string { if x != nil { return x.DesktopUri } return "" } -func (x *AttachDirectoryToDesktopSessionRequest) GetLogin() string { +func (x *SetSharedDirectoryForDesktopSessionRequest) GetLogin() string { if x != nil { return x.Login } return "" } -func (x *AttachDirectoryToDesktopSessionRequest) GetPath() string { +func (x *SetSharedDirectoryForDesktopSessionRequest) GetPath() string { if x != nil { return x.Path } return "" } -// Response for AttachDirectoryToDesktopSession. -type AttachDirectoryToDesktopSessionResponse struct { +// Response for SetSharedDirectoryForDesktopSession. +type SetSharedDirectoryForDesktopSessionResponse struct { state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *AttachDirectoryToDesktopSessionResponse) Reset() { - *x = AttachDirectoryToDesktopSessionResponse{} +func (x *SetSharedDirectoryForDesktopSessionResponse) Reset() { + *x = SetSharedDirectoryForDesktopSessionResponse{} mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *AttachDirectoryToDesktopSessionResponse) String() string { +func (x *SetSharedDirectoryForDesktopSessionResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AttachDirectoryToDesktopSessionResponse) ProtoMessage() {} +func (*SetSharedDirectoryForDesktopSessionResponse) ProtoMessage() {} -func (x *AttachDirectoryToDesktopSessionResponse) ProtoReflect() protoreflect.Message { +func (x *SetSharedDirectoryForDesktopSessionResponse) ProtoReflect() protoreflect.Message { mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[76] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4348,8 +4348,8 @@ func (x *AttachDirectoryToDesktopSessionResponse) ProtoReflect() protoreflect.Me return mi.MessageOf(x) } -// Deprecated: Use AttachDirectoryToDesktopSessionResponse.ProtoReflect.Descriptor instead. -func (*AttachDirectoryToDesktopSessionResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use SetSharedDirectoryForDesktopSessionResponse.ProtoReflect.Descriptor instead. +func (*SetSharedDirectoryForDesktopSessionResponse) Descriptor() ([]byte, []int) { return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{76} } @@ -4884,13 +4884,13 @@ const file_teleport_lib_teleterm_v1_service_proto_rawDesc = "" + "\x04data\x18\x01 \x01(\fR\x04data\x12N\n" + "\x0etarget_desktop\x18\x02 \x01(\v2'.teleport.lib.teleterm.v1.TargetDesktopR\rtargetDesktop\".\n" + "\x18ConnectToDesktopResponse\x12\x12\n" + - "\x04data\x18\x01 \x01(\fR\x04data\"s\n" + - "&AttachDirectoryToDesktopSessionRequest\x12\x1f\n" + + "\x04data\x18\x01 \x01(\fR\x04data\"w\n" + + "*SetSharedDirectoryForDesktopSessionRequest\x12\x1f\n" + "\vdesktop_uri\x18\x01 \x01(\tR\n" + "desktopUri\x12\x14\n" + "\x05login\x18\x02 \x01(\tR\x05login\x12\x12\n" + - "\x04path\x18\x03 \x01(\tR\x04path\")\n" + - "'AttachDirectoryToDesktopSessionResponse*\x97\x01\n" + + "\x04path\x18\x03 \x01(\tR\x04path\"-\n" + + "+SetSharedDirectoryForDesktopSessionResponse*\x97\x01\n" + "\x12PasswordlessPrompt\x12#\n" + "\x1fPASSWORDLESS_PROMPT_UNSPECIFIED\x10\x00\x12\x1b\n" + "\x17PASSWORDLESS_PROMPT_PIN\x10\x01\x12\x1b\n" + @@ -4904,7 +4904,7 @@ const file_teleport_lib_teleterm_v1_service_proto_rawDesc = "" + ")HEADLESS_AUTHENTICATION_STATE_UNSPECIFIED\x10\x00\x12)\n" + "%HEADLESS_AUTHENTICATION_STATE_PENDING\x10\x01\x12(\n" + "$HEADLESS_AUTHENTICATION_STATE_DENIED\x10\x02\x12*\n" + - "&HEADLESS_AUTHENTICATION_STATE_APPROVED\x10\x032\x86+\n" + + "&HEADLESS_AUTHENTICATION_STATE_APPROVED\x10\x032\x92+\n" + "\x0fTerminalService\x12\xa0\x01\n" + "\x1dUpdateTshdEventsServerAddress\x12>.teleport.lib.teleterm.v1.UpdateTshdEventsServerAddressRequest\x1a?.teleport.lib.teleterm.v1.UpdateTshdEventsServerAddressResponse\x12q\n" + "\x10ListRootClusters\x12-.teleport.lib.teleterm.v1.ListClustersRequest\x1a..teleport.lib.teleterm.v1.ListClustersResponse\x12u\n" + @@ -4951,8 +4951,8 @@ const file_teleport_lib_teleterm_v1_service_proto_rawDesc = "" + "\x15UpdateUserPreferences\x126.teleport.lib.teleterm.v1.UpdateUserPreferencesRequest\x1a7.teleport.lib.teleterm.v1.UpdateUserPreferencesResponse\x12\x88\x01\n" + "\x15AuthenticateWebDevice\x126.teleport.lib.teleterm.v1.AuthenticateWebDeviceRequest\x1a7.teleport.lib.teleterm.v1.AuthenticateWebDeviceResponse\x12[\n" + "\x06GetApp\x12'.teleport.lib.teleterm.v1.GetAppRequest\x1a(.teleport.lib.teleterm.v1.GetAppResponse\x12}\n" + - "\x10ConnectToDesktop\x121.teleport.lib.teleterm.v1.ConnectToDesktopRequest\x1a2.teleport.lib.teleterm.v1.ConnectToDesktopResponse(\x010\x01\x12\xa6\x01\n" + - "\x1fAttachDirectoryToDesktopSession\x12@.teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionRequest\x1aA.teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionResponseBTZRgithub.com/gravitational/teleport/gen/proto/go/teleport/lib/teleterm/v1;teletermv1b\x06proto3" + "\x10ConnectToDesktop\x121.teleport.lib.teleterm.v1.ConnectToDesktopRequest\x1a2.teleport.lib.teleterm.v1.ConnectToDesktopResponse(\x010\x01\x12\xb2\x01\n" + + "#SetSharedDirectoryForDesktopSession\x12D.teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionRequest\x1aE.teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionResponseBTZRgithub.com/gravitational/teleport/gen/proto/go/teleport/lib/teleterm/v1;teletermv1b\x06proto3" var ( file_teleport_lib_teleterm_v1_service_proto_rawDescOnce sync.Once @@ -5047,8 +5047,8 @@ var file_teleport_lib_teleterm_v1_service_proto_goTypes = []any{ (*TargetDesktop)(nil), // 75: teleport.lib.teleterm.v1.TargetDesktop (*ConnectToDesktopRequest)(nil), // 76: teleport.lib.teleterm.v1.ConnectToDesktopRequest (*ConnectToDesktopResponse)(nil), // 77: teleport.lib.teleterm.v1.ConnectToDesktopResponse - (*AttachDirectoryToDesktopSessionRequest)(nil), // 78: teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionRequest - (*AttachDirectoryToDesktopSessionResponse)(nil), // 79: teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionResponse + (*SetSharedDirectoryForDesktopSessionRequest)(nil), // 78: teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionRequest + (*SetSharedDirectoryForDesktopSessionResponse)(nil), // 79: teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionResponse (*LoginPasswordlessRequest_LoginPasswordlessRequestInit)(nil), // 80: teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessRequestInit (*LoginPasswordlessRequest_LoginPasswordlessPINResponse)(nil), // 81: teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessPINResponse (*LoginPasswordlessRequest_LoginPasswordlessCredentialResponse)(nil), // 82: teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessCredentialResponse @@ -5158,7 +5158,7 @@ var file_teleport_lib_teleterm_v1_service_proto_depIdxs = []int32{ 71, // 81: teleport.lib.teleterm.v1.TerminalService.AuthenticateWebDevice:input_type -> teleport.lib.teleterm.v1.AuthenticateWebDeviceRequest 73, // 82: teleport.lib.teleterm.v1.TerminalService.GetApp:input_type -> teleport.lib.teleterm.v1.GetAppRequest 76, // 83: teleport.lib.teleterm.v1.TerminalService.ConnectToDesktop:input_type -> teleport.lib.teleterm.v1.ConnectToDesktopRequest - 78, // 84: teleport.lib.teleterm.v1.TerminalService.AttachDirectoryToDesktopSession:input_type -> teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionRequest + 78, // 84: teleport.lib.teleterm.v1.TerminalService.SetSharedDirectoryForDesktopSession:input_type -> teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionRequest 49, // 85: teleport.lib.teleterm.v1.TerminalService.UpdateTshdEventsServerAddress:output_type -> teleport.lib.teleterm.v1.UpdateTshdEventsServerAddressResponse 35, // 86: teleport.lib.teleterm.v1.TerminalService.ListRootClusters:output_type -> teleport.lib.teleterm.v1.ListClustersResponse 35, // 87: teleport.lib.teleterm.v1.TerminalService.ListLeafClusters:output_type -> teleport.lib.teleterm.v1.ListClustersResponse @@ -5201,7 +5201,7 @@ var file_teleport_lib_teleterm_v1_service_proto_depIdxs = []int32{ 72, // 124: teleport.lib.teleterm.v1.TerminalService.AuthenticateWebDevice:output_type -> teleport.lib.teleterm.v1.AuthenticateWebDeviceResponse 74, // 125: teleport.lib.teleterm.v1.TerminalService.GetApp:output_type -> teleport.lib.teleterm.v1.GetAppResponse 77, // 126: teleport.lib.teleterm.v1.TerminalService.ConnectToDesktop:output_type -> teleport.lib.teleterm.v1.ConnectToDesktopResponse - 79, // 127: teleport.lib.teleterm.v1.TerminalService.AttachDirectoryToDesktopSession:output_type -> teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionResponse + 79, // 127: teleport.lib.teleterm.v1.TerminalService.SetSharedDirectoryForDesktopSession:output_type -> teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionResponse 85, // [85:128] is the sub-list for method output_type 42, // [42:85] is the sub-list for method input_type 42, // [42:42] is the sub-list for extension type_name diff --git a/gen/proto/go/teleport/lib/teleterm/v1/service_grpc.pb.go b/gen/proto/go/teleport/lib/teleterm/v1/service_grpc.pb.go index 2b10f6293289b..53af43ba0d284 100644 --- a/gen/proto/go/teleport/lib/teleterm/v1/service_grpc.pb.go +++ b/gen/proto/go/teleport/lib/teleterm/v1/service_grpc.pb.go @@ -36,49 +36,49 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - TerminalService_UpdateTshdEventsServerAddress_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/UpdateTshdEventsServerAddress" - TerminalService_ListRootClusters_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/ListRootClusters" - TerminalService_ListLeafClusters_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/ListLeafClusters" - TerminalService_StartHeadlessWatcher_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/StartHeadlessWatcher" - TerminalService_ListDatabaseUsers_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/ListDatabaseUsers" - TerminalService_GetServers_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/GetServers" - TerminalService_GetAccessRequests_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/GetAccessRequests" - TerminalService_GetAccessRequest_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/GetAccessRequest" - TerminalService_DeleteAccessRequest_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/DeleteAccessRequest" - TerminalService_CreateAccessRequest_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/CreateAccessRequest" - TerminalService_ReviewAccessRequest_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/ReviewAccessRequest" - TerminalService_GetRequestableRoles_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/GetRequestableRoles" - TerminalService_AssumeRole_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/AssumeRole" - TerminalService_PromoteAccessRequest_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/PromoteAccessRequest" - TerminalService_GetSuggestedAccessLists_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/GetSuggestedAccessLists" - TerminalService_ListKubernetesResources_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/ListKubernetesResources" - TerminalService_AddCluster_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/AddCluster" - TerminalService_RemoveCluster_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/RemoveCluster" - TerminalService_ListGateways_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/ListGateways" - TerminalService_CreateGateway_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/CreateGateway" - TerminalService_RemoveGateway_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/RemoveGateway" - TerminalService_SetGatewayTargetSubresourceName_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/SetGatewayTargetSubresourceName" - TerminalService_SetGatewayLocalPort_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/SetGatewayLocalPort" - TerminalService_GetAuthSettings_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/GetAuthSettings" - TerminalService_GetCluster_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/GetCluster" - TerminalService_Login_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/Login" - TerminalService_LoginPasswordless_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/LoginPasswordless" - TerminalService_Logout_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/Logout" - TerminalService_TransferFile_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/TransferFile" - TerminalService_ReportUsageEvent_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/ReportUsageEvent" - TerminalService_UpdateHeadlessAuthenticationState_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/UpdateHeadlessAuthenticationState" - TerminalService_CreateConnectMyComputerRole_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/CreateConnectMyComputerRole" - TerminalService_CreateConnectMyComputerNodeToken_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/CreateConnectMyComputerNodeToken" - TerminalService_WaitForConnectMyComputerNodeJoin_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/WaitForConnectMyComputerNodeJoin" - TerminalService_DeleteConnectMyComputerNode_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/DeleteConnectMyComputerNode" - TerminalService_GetConnectMyComputerNodeName_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/GetConnectMyComputerNodeName" - TerminalService_ListUnifiedResources_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/ListUnifiedResources" - TerminalService_GetUserPreferences_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/GetUserPreferences" - TerminalService_UpdateUserPreferences_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/UpdateUserPreferences" - TerminalService_AuthenticateWebDevice_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/AuthenticateWebDevice" - TerminalService_GetApp_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/GetApp" - TerminalService_ConnectToDesktop_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/ConnectToDesktop" - TerminalService_AttachDirectoryToDesktopSession_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/AttachDirectoryToDesktopSession" + TerminalService_UpdateTshdEventsServerAddress_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/UpdateTshdEventsServerAddress" + TerminalService_ListRootClusters_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/ListRootClusters" + TerminalService_ListLeafClusters_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/ListLeafClusters" + TerminalService_StartHeadlessWatcher_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/StartHeadlessWatcher" + TerminalService_ListDatabaseUsers_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/ListDatabaseUsers" + TerminalService_GetServers_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/GetServers" + TerminalService_GetAccessRequests_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/GetAccessRequests" + TerminalService_GetAccessRequest_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/GetAccessRequest" + TerminalService_DeleteAccessRequest_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/DeleteAccessRequest" + TerminalService_CreateAccessRequest_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/CreateAccessRequest" + TerminalService_ReviewAccessRequest_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/ReviewAccessRequest" + TerminalService_GetRequestableRoles_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/GetRequestableRoles" + TerminalService_AssumeRole_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/AssumeRole" + TerminalService_PromoteAccessRequest_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/PromoteAccessRequest" + TerminalService_GetSuggestedAccessLists_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/GetSuggestedAccessLists" + TerminalService_ListKubernetesResources_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/ListKubernetesResources" + TerminalService_AddCluster_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/AddCluster" + TerminalService_RemoveCluster_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/RemoveCluster" + TerminalService_ListGateways_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/ListGateways" + TerminalService_CreateGateway_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/CreateGateway" + TerminalService_RemoveGateway_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/RemoveGateway" + TerminalService_SetGatewayTargetSubresourceName_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/SetGatewayTargetSubresourceName" + TerminalService_SetGatewayLocalPort_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/SetGatewayLocalPort" + TerminalService_GetAuthSettings_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/GetAuthSettings" + TerminalService_GetCluster_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/GetCluster" + TerminalService_Login_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/Login" + TerminalService_LoginPasswordless_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/LoginPasswordless" + TerminalService_Logout_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/Logout" + TerminalService_TransferFile_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/TransferFile" + TerminalService_ReportUsageEvent_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/ReportUsageEvent" + TerminalService_UpdateHeadlessAuthenticationState_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/UpdateHeadlessAuthenticationState" + TerminalService_CreateConnectMyComputerRole_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/CreateConnectMyComputerRole" + TerminalService_CreateConnectMyComputerNodeToken_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/CreateConnectMyComputerNodeToken" + TerminalService_WaitForConnectMyComputerNodeJoin_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/WaitForConnectMyComputerNodeJoin" + TerminalService_DeleteConnectMyComputerNode_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/DeleteConnectMyComputerNode" + TerminalService_GetConnectMyComputerNodeName_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/GetConnectMyComputerNodeName" + TerminalService_ListUnifiedResources_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/ListUnifiedResources" + TerminalService_GetUserPreferences_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/GetUserPreferences" + TerminalService_UpdateUserPreferences_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/UpdateUserPreferences" + TerminalService_AuthenticateWebDevice_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/AuthenticateWebDevice" + TerminalService_GetApp_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/GetApp" + TerminalService_ConnectToDesktop_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/ConnectToDesktop" + TerminalService_SetSharedDirectoryForDesktopSession_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/SetSharedDirectoryForDesktopSession" ) // TerminalServiceClient is the client API for TerminalService service. @@ -221,13 +221,13 @@ type TerminalServiceClient interface { GetApp(ctx context.Context, in *GetAppRequest, opts ...grpc.CallOption) (*GetAppResponse, error) // ConnectToDesktop is a bidirectional stream for the desktop connection. ConnectToDesktop(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[ConnectToDesktopRequest, ConnectToDesktopResponse], error) - // AttachDirectoryToDesktopSession opens a directory for a desktop session and enables file system operations for it. + // SetSharedDirectoryForDesktopSession opens a directory for a desktop session and enables file system operations for it. // If there is no active desktop session associated with the specified desktop_uri and login, // the RPC returns an error. // // This RPC does not automatically share the directory with the server (it does not send a SharedDirectoryAnnounce message). // It only registers file system handlers for processing file system-related TDP events. - AttachDirectoryToDesktopSession(ctx context.Context, in *AttachDirectoryToDesktopSessionRequest, opts ...grpc.CallOption) (*AttachDirectoryToDesktopSessionResponse, error) + SetSharedDirectoryForDesktopSession(ctx context.Context, in *SetSharedDirectoryForDesktopSessionRequest, opts ...grpc.CallOption) (*SetSharedDirectoryForDesktopSessionResponse, error) } type terminalServiceClient struct { @@ -674,10 +674,10 @@ func (c *terminalServiceClient) ConnectToDesktop(ctx context.Context, opts ...gr // This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. type TerminalService_ConnectToDesktopClient = grpc.BidiStreamingClient[ConnectToDesktopRequest, ConnectToDesktopResponse] -func (c *terminalServiceClient) AttachDirectoryToDesktopSession(ctx context.Context, in *AttachDirectoryToDesktopSessionRequest, opts ...grpc.CallOption) (*AttachDirectoryToDesktopSessionResponse, error) { +func (c *terminalServiceClient) SetSharedDirectoryForDesktopSession(ctx context.Context, in *SetSharedDirectoryForDesktopSessionRequest, opts ...grpc.CallOption) (*SetSharedDirectoryForDesktopSessionResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(AttachDirectoryToDesktopSessionResponse) - err := c.cc.Invoke(ctx, TerminalService_AttachDirectoryToDesktopSession_FullMethodName, in, out, cOpts...) + out := new(SetSharedDirectoryForDesktopSessionResponse) + err := c.cc.Invoke(ctx, TerminalService_SetSharedDirectoryForDesktopSession_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -824,13 +824,13 @@ type TerminalServiceServer interface { GetApp(context.Context, *GetAppRequest) (*GetAppResponse, error) // ConnectToDesktop is a bidirectional stream for the desktop connection. ConnectToDesktop(grpc.BidiStreamingServer[ConnectToDesktopRequest, ConnectToDesktopResponse]) error - // AttachDirectoryToDesktopSession opens a directory for a desktop session and enables file system operations for it. + // SetSharedDirectoryForDesktopSession opens a directory for a desktop session and enables file system operations for it. // If there is no active desktop session associated with the specified desktop_uri and login, // the RPC returns an error. // // This RPC does not automatically share the directory with the server (it does not send a SharedDirectoryAnnounce message). // It only registers file system handlers for processing file system-related TDP events. - AttachDirectoryToDesktopSession(context.Context, *AttachDirectoryToDesktopSessionRequest) (*AttachDirectoryToDesktopSessionResponse, error) + SetSharedDirectoryForDesktopSession(context.Context, *SetSharedDirectoryForDesktopSessionRequest) (*SetSharedDirectoryForDesktopSessionResponse, error) mustEmbedUnimplementedTerminalServiceServer() } @@ -967,8 +967,8 @@ func (UnimplementedTerminalServiceServer) GetApp(context.Context, *GetAppRequest func (UnimplementedTerminalServiceServer) ConnectToDesktop(grpc.BidiStreamingServer[ConnectToDesktopRequest, ConnectToDesktopResponse]) error { return status.Errorf(codes.Unimplemented, "method ConnectToDesktop not implemented") } -func (UnimplementedTerminalServiceServer) AttachDirectoryToDesktopSession(context.Context, *AttachDirectoryToDesktopSessionRequest) (*AttachDirectoryToDesktopSessionResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method AttachDirectoryToDesktopSession not implemented") +func (UnimplementedTerminalServiceServer) SetSharedDirectoryForDesktopSession(context.Context, *SetSharedDirectoryForDesktopSessionRequest) (*SetSharedDirectoryForDesktopSessionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetSharedDirectoryForDesktopSession not implemented") } func (UnimplementedTerminalServiceServer) mustEmbedUnimplementedTerminalServiceServer() {} func (UnimplementedTerminalServiceServer) testEmbeddedByValue() {} @@ -1718,20 +1718,20 @@ func _TerminalService_ConnectToDesktop_Handler(srv interface{}, stream grpc.Serv // This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. type TerminalService_ConnectToDesktopServer = grpc.BidiStreamingServer[ConnectToDesktopRequest, ConnectToDesktopResponse] -func _TerminalService_AttachDirectoryToDesktopSession_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(AttachDirectoryToDesktopSessionRequest) +func _TerminalService_SetSharedDirectoryForDesktopSession_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetSharedDirectoryForDesktopSessionRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(TerminalServiceServer).AttachDirectoryToDesktopSession(ctx, in) + return srv.(TerminalServiceServer).SetSharedDirectoryForDesktopSession(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: TerminalService_AttachDirectoryToDesktopSession_FullMethodName, + FullMethod: TerminalService_SetSharedDirectoryForDesktopSession_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TerminalServiceServer).AttachDirectoryToDesktopSession(ctx, req.(*AttachDirectoryToDesktopSessionRequest)) + return srv.(TerminalServiceServer).SetSharedDirectoryForDesktopSession(ctx, req.(*SetSharedDirectoryForDesktopSessionRequest)) } return interceptor(ctx, in, info, handler) } @@ -1900,8 +1900,8 @@ var TerminalService_ServiceDesc = grpc.ServiceDesc{ Handler: _TerminalService_GetApp_Handler, }, { - MethodName: "AttachDirectoryToDesktopSession", - Handler: _TerminalService_AttachDirectoryToDesktopSession_Handler, + MethodName: "SetSharedDirectoryForDesktopSession", + Handler: _TerminalService_SetSharedDirectoryForDesktopSession_Handler, }, }, Streams: []grpc.StreamDesc{ diff --git a/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.client.ts b/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.client.ts index 7165cf77fef08..ed90c5c751425 100644 --- a/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.client.ts +++ b/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.client.ts @@ -24,8 +24,8 @@ import type { RpcTransport } from "@protobuf-ts/runtime-rpc"; import type { ServiceInfo } from "@protobuf-ts/runtime-rpc"; import { TerminalService } from "./service_pb"; -import type { AttachDirectoryToDesktopSessionResponse } from "./service_pb"; -import type { AttachDirectoryToDesktopSessionRequest } from "./service_pb"; +import type { SetSharedDirectoryForDesktopSessionResponse } from "./service_pb"; +import type { SetSharedDirectoryForDesktopSessionRequest } from "./service_pb"; import type { ConnectToDesktopResponse } from "./service_pb"; import type { ConnectToDesktopRequest } from "./service_pb"; import type { GetAppResponse } from "./service_pb"; @@ -414,16 +414,16 @@ export interface ITerminalServiceClient { */ connectToDesktop(options?: RpcOptions): DuplexStreamingCall; /** - * AttachDirectoryToDesktopSession opens a directory for a desktop session and enables file system operations for it. + * SetSharedDirectoryForDesktopSession opens a directory for a desktop session and enables file system operations for it. * If there is no active desktop session associated with the specified desktop_uri and login, * the RPC returns an error. * * This RPC does not automatically share the directory with the server (it does not send a SharedDirectoryAnnounce message). * It only registers file system handlers for processing file system-related TDP events. * - * @generated from protobuf rpc: AttachDirectoryToDesktopSession(teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionRequest) returns (teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionResponse); + * @generated from protobuf rpc: SetSharedDirectoryForDesktopSession(teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionRequest) returns (teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionResponse); */ - attachDirectoryToDesktopSession(input: AttachDirectoryToDesktopSessionRequest, options?: RpcOptions): UnaryCall; + setSharedDirectoryForDesktopSession(input: SetSharedDirectoryForDesktopSessionRequest, options?: RpcOptions): UnaryCall; } /** * TerminalService is used by the Electron app to communicate with the tsh daemon. @@ -865,17 +865,17 @@ export class TerminalServiceClient implements ITerminalServiceClient, ServiceInf return stackIntercept("duplex", this._transport, method, opt); } /** - * AttachDirectoryToDesktopSession opens a directory for a desktop session and enables file system operations for it. + * SetSharedDirectoryForDesktopSession opens a directory for a desktop session and enables file system operations for it. * If there is no active desktop session associated with the specified desktop_uri and login, * the RPC returns an error. * * This RPC does not automatically share the directory with the server (it does not send a SharedDirectoryAnnounce message). * It only registers file system handlers for processing file system-related TDP events. * - * @generated from protobuf rpc: AttachDirectoryToDesktopSession(teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionRequest) returns (teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionResponse); + * @generated from protobuf rpc: SetSharedDirectoryForDesktopSession(teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionRequest) returns (teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionResponse); */ - attachDirectoryToDesktopSession(input: AttachDirectoryToDesktopSessionRequest, options?: RpcOptions): UnaryCall { + setSharedDirectoryForDesktopSession(input: SetSharedDirectoryForDesktopSessionRequest, options?: RpcOptions): UnaryCall { const method = this.methods[42], opt = this._transport.mergeOptions(options); - return stackIntercept("unary", this._transport, method, opt, input); + return stackIntercept("unary", this._transport, method, opt, input); } } diff --git a/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.grpc-server.ts b/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.grpc-server.ts index 3f2fca6c24949..c4548e88a4ffb 100644 --- a/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.grpc-server.ts +++ b/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.grpc-server.ts @@ -21,8 +21,8 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . // -import { AttachDirectoryToDesktopSessionResponse } from "./service_pb"; -import { AttachDirectoryToDesktopSessionRequest } from "./service_pb"; +import { SetSharedDirectoryForDesktopSessionResponse } from "./service_pb"; +import { SetSharedDirectoryForDesktopSessionRequest } from "./service_pb"; import { ConnectToDesktopResponse } from "./service_pb"; import { ConnectToDesktopRequest } from "./service_pb"; import { GetAppResponse } from "./service_pb"; @@ -407,16 +407,16 @@ export interface ITerminalService extends grpc.UntypedServiceImplementation { */ connectToDesktop: grpc.handleBidiStreamingCall; /** - * AttachDirectoryToDesktopSession opens a directory for a desktop session and enables file system operations for it. + * SetSharedDirectoryForDesktopSession opens a directory for a desktop session and enables file system operations for it. * If there is no active desktop session associated with the specified desktop_uri and login, * the RPC returns an error. * * This RPC does not automatically share the directory with the server (it does not send a SharedDirectoryAnnounce message). * It only registers file system handlers for processing file system-related TDP events. * - * @generated from protobuf rpc: AttachDirectoryToDesktopSession(teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionRequest) returns (teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionResponse); + * @generated from protobuf rpc: SetSharedDirectoryForDesktopSession(teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionRequest) returns (teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionResponse); */ - attachDirectoryToDesktopSession: grpc.handleUnaryCall; + setSharedDirectoryForDesktopSession: grpc.handleUnaryCall; } /** * @grpc/grpc-js definition for the protobuf service teleport.lib.teleterm.v1.TerminalService. @@ -850,14 +850,14 @@ export const terminalServiceDefinition: grpc.ServiceDefinition responseSerialize: value => Buffer.from(ConnectToDesktopResponse.toBinary(value)), requestSerialize: value => Buffer.from(ConnectToDesktopRequest.toBinary(value)) }, - attachDirectoryToDesktopSession: { - path: "/teleport.lib.teleterm.v1.TerminalService/AttachDirectoryToDesktopSession", - originalName: "AttachDirectoryToDesktopSession", + setSharedDirectoryForDesktopSession: { + path: "/teleport.lib.teleterm.v1.TerminalService/SetSharedDirectoryForDesktopSession", + originalName: "SetSharedDirectoryForDesktopSession", requestStream: false, responseStream: false, - responseDeserialize: bytes => AttachDirectoryToDesktopSessionResponse.fromBinary(bytes), - requestDeserialize: bytes => AttachDirectoryToDesktopSessionRequest.fromBinary(bytes), - responseSerialize: value => Buffer.from(AttachDirectoryToDesktopSessionResponse.toBinary(value)), - requestSerialize: value => Buffer.from(AttachDirectoryToDesktopSessionRequest.toBinary(value)) + responseDeserialize: bytes => SetSharedDirectoryForDesktopSessionResponse.fromBinary(bytes), + requestDeserialize: bytes => SetSharedDirectoryForDesktopSessionRequest.fromBinary(bytes), + responseSerialize: value => Buffer.from(SetSharedDirectoryForDesktopSessionResponse.toBinary(value)), + requestSerialize: value => Buffer.from(SetSharedDirectoryForDesktopSessionRequest.toBinary(value)) } }; diff --git a/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.ts b/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.ts index 683cbe49c95ec..c1b654e3cfb54 100644 --- a/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.ts +++ b/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.ts @@ -1257,11 +1257,11 @@ export interface ConnectToDesktopResponse { data: Uint8Array; } /** - * Request for AttachDirectoryToDesktopSession. + * Request for SetSharedDirectoryForDesktopSession. * - * @generated from protobuf message teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionRequest + * @generated from protobuf message teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionRequest */ -export interface AttachDirectoryToDesktopSessionRequest { +export interface SetSharedDirectoryForDesktopSessionRequest { /** * URI of the desktop. * @@ -1282,11 +1282,11 @@ export interface AttachDirectoryToDesktopSessionRequest { path: string; } /** - * Response for AttachDirectoryToDesktopSession. + * Response for SetSharedDirectoryForDesktopSession. * - * @generated from protobuf message teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionResponse + * @generated from protobuf message teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionResponse */ -export interface AttachDirectoryToDesktopSessionResponse { +export interface SetSharedDirectoryForDesktopSessionResponse { } /** * PasswordlessPrompt describes different prompts we need from users @@ -5604,24 +5604,24 @@ class ConnectToDesktopResponse$Type extends MessageType { +class SetSharedDirectoryForDesktopSessionRequest$Type extends MessageType { constructor() { - super("teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionRequest", [ + super("teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionRequest", [ { no: 1, name: "desktop_uri", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, { no: 2, name: "login", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, { no: 3, name: "path", kind: "scalar", T: 9 /*ScalarType.STRING*/ } ]); } - create(value?: PartialMessage): AttachDirectoryToDesktopSessionRequest { + create(value?: PartialMessage): SetSharedDirectoryForDesktopSessionRequest { const message = globalThis.Object.create((this.messagePrototype!)); message.desktopUri = ""; message.login = ""; message.path = ""; if (value !== undefined) - reflectionMergePartial(this, message, value); + reflectionMergePartial(this, message, value); return message; } - internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: AttachDirectoryToDesktopSessionRequest): AttachDirectoryToDesktopSessionRequest { + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SetSharedDirectoryForDesktopSessionRequest): SetSharedDirectoryForDesktopSessionRequest { let message = target ?? this.create(), end = reader.pos + length; while (reader.pos < end) { let [fieldNo, wireType] = reader.tag(); @@ -5646,7 +5646,7 @@ class AttachDirectoryToDesktopSessionRequest$Type extends MessageType { +class SetSharedDirectoryForDesktopSessionResponse$Type extends MessageType { constructor() { - super("teleport.lib.teleterm.v1.AttachDirectoryToDesktopSessionResponse", []); + super("teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionResponse", []); } - create(value?: PartialMessage): AttachDirectoryToDesktopSessionResponse { + create(value?: PartialMessage): SetSharedDirectoryForDesktopSessionResponse { const message = globalThis.Object.create((this.messagePrototype!)); if (value !== undefined) - reflectionMergePartial(this, message, value); + reflectionMergePartial(this, message, value); return message; } - internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: AttachDirectoryToDesktopSessionResponse): AttachDirectoryToDesktopSessionResponse { + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: SetSharedDirectoryForDesktopSessionResponse): SetSharedDirectoryForDesktopSessionResponse { return target ?? this.create(); } - internalBinaryWrite(message: AttachDirectoryToDesktopSessionResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + internalBinaryWrite(message: SetSharedDirectoryForDesktopSessionResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { let u = options.writeUnknownFields; if (u !== false) (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); @@ -5688,9 +5688,9 @@ class AttachDirectoryToDesktopSessionResponse$Type extends MessageType( function withoutInsecureTshdMethods(client: TshdClient): TshdClient { return { ...client, - attachDirectoryToDesktopSession: () => { + setSharedDirectoryForDesktopSession: () => { // Prevent the renderer process from sharing directories at arbitrary paths. throw new Error('This method is not permitted in the renderer process.'); }, diff --git a/web/packages/teleterm/src/services/tshd/fixtures/mocks.ts b/web/packages/teleterm/src/services/tshd/fixtures/mocks.ts index fbfdc7e7ec1b8..da36ca1d41d73 100644 --- a/web/packages/teleterm/src/services/tshd/fixtures/mocks.ts +++ b/web/packages/teleterm/src/services/tshd/fixtures/mocks.ts @@ -116,7 +116,7 @@ export class MockTshClient implements TshdClient { startHeadlessWatcher = () => new MockedUnaryCall({}); getApp = () => new MockedUnaryCall({ app: makeApp() }); connectToDesktop = undefined; - attachDirectoryToDesktopSession = () => new MockedUnaryCall({}); + setSharedDirectoryForDesktopSession = () => new MockedUnaryCall({}); } export class MockVnetClient implements VnetClient { diff --git a/web/packages/teleterm/src/ui/DocumentDesktopSession/DocumentDesktopSession.tsx b/web/packages/teleterm/src/ui/DocumentDesktopSession/DocumentDesktopSession.tsx index a17b95be95cf6..dc868e2612573 100644 --- a/web/packages/teleterm/src/ui/DocumentDesktopSession/DocumentDesktopSession.tsx +++ b/web/packages/teleterm/src/ui/DocumentDesktopSession/DocumentDesktopSession.tsx @@ -179,7 +179,7 @@ async function adaptGRPCStreamToTdpTransport( * The tshd daemon is responsible for handling directory sharing. * * The process begins when the Electron main process opens a directory picker. - * Once a path is selected, it is passed to tshd via the AttachDirectoryToDesktopSession API. + * Once a path is selected, it is passed to tshd via the SetSharedDirectoryForDesktopSession API. * * tshd then verifies whether there is an active session for the specified desktop user and attempts to open the directory. * Once that's done, everything is ready on the tsh daemon to intercept and handle the file system events. From 61f6ac76bba63b08555a1e28abb93b5cd55114a1 Mon Sep 17 00:00:00 2001 From: Grzegorz Zdunek Date: Tue, 13 May 2025 11:10:29 +0200 Subject: [PATCH 09/14] Improve comments --- lib/teleterm/services/desktop/desktop.go | 30 ++++++++++++++---------- web/packages/teleterm/src/preload.ts | 7 +++--- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/lib/teleterm/services/desktop/desktop.go b/lib/teleterm/services/desktop/desktop.go index c1b240c624ab7..6c8c144bad146 100644 --- a/lib/teleterm/services/desktop/desktop.go +++ b/lib/teleterm/services/desktop/desktop.go @@ -137,12 +137,12 @@ func (s *Session) Start(ctx context.Context, stream grpc.BidiStreamingServer[api return trace.Wrap(err) } - interceptor := serverInterceptor{ + fsHandle := fsRequestHandler{ directoryAccessProvider: s, } tdpConnProxy := tdp.NewConnProxy(downstreamRW, conn, func(tdpConn *tdp.Conn, message tdp.Message) (tdp.Message, error) { - msg, intErr := interceptor.process(message, func(message tdp.Message) error { + msg, intErr := fsHandle.process(message, func(message tdp.Message) error { return trace.Wrap(tdpConn.WriteMessage(message)) }) if intErr != nil { @@ -217,8 +217,12 @@ func isClientMessageAllowed(msg tdp.Message) error { } } -// serverInterceptor intercepts and processes messages sent from the server to the client. -type serverInterceptor struct { +// fsRequestHandler handles file system messages sent from the server to the client. +// +// If a message is a file system request, it is handled internally via DirectoryAccess instead of being +// forwarded to the Electron app. The response is then sent back to the server. +// If the message is not a file system request, it is returned as-is to be forwarded to the client. +type fsRequestHandler struct { directoryAccessProvider directoryAccessProvider } @@ -226,7 +230,7 @@ type directoryAccessProvider interface { GetDirectoryAccess() (*DirectoryAccess, error) } -func (d *serverInterceptor) process(msg tdp.Message, sendToServer func(message tdp.Message) error) (tdp.Message, error) { +func (d *fsRequestHandler) process(msg tdp.Message, sendToServer func(message tdp.Message) error) (tdp.Message, error) { switch r := msg.(type) { case tdp.SharedDirectoryInfoRequest: return nil, trace.Wrap(d.handleSharedDirectoryInfoRequest(r, sendToServer)) @@ -258,7 +262,7 @@ const ( SharedDirectoryErrCodeAlreadyExists ) -func (d *serverInterceptor) handleSharedDirectoryInfoRequest(r tdp.SharedDirectoryInfoRequest, sendToServer func(message tdp.Message) error) error { +func (d *fsRequestHandler) handleSharedDirectoryInfoRequest(r tdp.SharedDirectoryInfoRequest, sendToServer func(message tdp.Message) error) error { dirAccess, err := d.directoryAccessProvider.GetDirectoryAccess() if err != nil { return trace.Wrap(err) @@ -287,7 +291,7 @@ func (d *serverInterceptor) handleSharedDirectoryInfoRequest(r tdp.SharedDirecto return trace.Wrap(err) } -func (d *serverInterceptor) handleSharedDirectoryListRequest(r tdp.SharedDirectoryListRequest, sendToServer func(message tdp.Message) error) error { +func (d *fsRequestHandler) handleSharedDirectoryListRequest(r tdp.SharedDirectoryListRequest, sendToServer func(message tdp.Message) error) error { dirAccess, err := d.directoryAccessProvider.GetDirectoryAccess() if err != nil { return trace.Wrap(err) @@ -310,7 +314,7 @@ func (d *serverInterceptor) handleSharedDirectoryListRequest(r tdp.SharedDirecto return trace.Wrap(err) } -func (d *serverInterceptor) handleSharedDirectoryReadRequest(r tdp.SharedDirectoryReadRequest, sendToServer func(message tdp.Message) error) error { +func (d *fsRequestHandler) handleSharedDirectoryReadRequest(r tdp.SharedDirectoryReadRequest, sendToServer func(message tdp.Message) error) error { dirAccess, err := d.directoryAccessProvider.GetDirectoryAccess() if err != nil { return trace.Wrap(err) @@ -331,7 +335,7 @@ func (d *serverInterceptor) handleSharedDirectoryReadRequest(r tdp.SharedDirecto return trace.Wrap(err) } -func (d *serverInterceptor) handleSharedDirectoryMoveRequest(r tdp.SharedDirectoryMoveRequest, sendToServer func(message tdp.Message) error) error { +func (d *fsRequestHandler) handleSharedDirectoryMoveRequest(r tdp.SharedDirectoryMoveRequest, sendToServer func(message tdp.Message) error) error { err := sendToServer(tdp.SharedDirectoryMoveResponse{ CompletionID: r.CompletionID, ErrCode: uint32(SharedDirectoryErrCodeFailed), @@ -343,7 +347,7 @@ func (d *serverInterceptor) handleSharedDirectoryMoveRequest(r tdp.SharedDirecto return trace.NotImplemented("Moving or renaming files and directories within a shared directory is not supported.") } -func (d *serverInterceptor) handleSharedDirectoryWriteRequest(r tdp.SharedDirectoryWriteRequest, sendToServer func(message tdp.Message) error) error { +func (d *fsRequestHandler) handleSharedDirectoryWriteRequest(r tdp.SharedDirectoryWriteRequest, sendToServer func(message tdp.Message) error) error { dirAccess, err := d.directoryAccessProvider.GetDirectoryAccess() if err != nil { return trace.Wrap(err) @@ -361,7 +365,7 @@ func (d *serverInterceptor) handleSharedDirectoryWriteRequest(r tdp.SharedDirect return trace.Wrap(err) } -func (d *serverInterceptor) handleSharedDirectoryTruncateRequest(r tdp.SharedDirectoryTruncateRequest, sendToServer func(message tdp.Message) error) error { +func (d *fsRequestHandler) handleSharedDirectoryTruncateRequest(r tdp.SharedDirectoryTruncateRequest, sendToServer func(message tdp.Message) error) error { dirAccess, err := d.directoryAccessProvider.GetDirectoryAccess() if err != nil { return trace.Wrap(err) @@ -378,7 +382,7 @@ func (d *serverInterceptor) handleSharedDirectoryTruncateRequest(r tdp.SharedDir return trace.Wrap(err) } -func (d *serverInterceptor) handleSharedDirectoryCreateRequest(r tdp.SharedDirectoryCreateRequest, sendToServer func(message tdp.Message) error) error { +func (d *fsRequestHandler) handleSharedDirectoryCreateRequest(r tdp.SharedDirectoryCreateRequest, sendToServer func(message tdp.Message) error) error { dirAccess, err := d.directoryAccessProvider.GetDirectoryAccess() if err != nil { return trace.Wrap(err) @@ -401,7 +405,7 @@ func (d *serverInterceptor) handleSharedDirectoryCreateRequest(r tdp.SharedDirec return trace.Wrap(err) } -func (d *serverInterceptor) handleSharedDirectoryDeleteRequest(r tdp.SharedDirectoryDeleteRequest, sendToServer func(message tdp.Message) error) error { +func (d *fsRequestHandler) handleSharedDirectoryDeleteRequest(r tdp.SharedDirectoryDeleteRequest, sendToServer func(message tdp.Message) error) error { dirAccess, err := d.directoryAccessProvider.GetDirectoryAccess() if err != nil { return trace.Wrap(err) diff --git a/web/packages/teleterm/src/preload.ts b/web/packages/teleterm/src/preload.ts index 2a0e5062f120f..71e197acb2d60 100644 --- a/web/packages/teleterm/src/preload.ts +++ b/web/packages/teleterm/src/preload.ts @@ -173,9 +173,10 @@ async function withErrorLogging( * Returns a copy of `TshdClient` with insecure methods disabled * to prevent access from the untrusted renderer process. * - * This is possible thanks to the context bridge and the `cloneClient` function, - * which selectively clones only RPC methods and nothing more. - * As a result, disabled methods are inaccessible via the `tshdClient` prototype. + * As a result, disabled methods are inaccessible in the renderer process + * since the prototype of tshdClient is not shared with the renderer process. + * The renderer process also does not receive the ability to start a new arbitrary client, + * which could then be used to circumvent this protection. */ function withoutInsecureTshdMethods(client: TshdClient): TshdClient { return { From 46673639eaec7b0540cf0a24bea561a3da7a7d71 Mon Sep 17 00:00:00 2001 From: Grzegorz Zdunek Date: Tue, 13 May 2025 11:44:19 +0200 Subject: [PATCH 10/14] Small fixes --- lib/teleterm/services/desktop/desktop.go | 2 +- lib/teleterm/services/desktop/desktop_test.go | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/teleterm/services/desktop/desktop.go b/lib/teleterm/services/desktop/desktop.go index 6c8c144bad146..dcef1f9213b80 100644 --- a/lib/teleterm/services/desktop/desktop.go +++ b/lib/teleterm/services/desktop/desktop.go @@ -68,7 +68,7 @@ func (s *Session) SetSharedDirectory(basePath string) error { defer s.dirAccessMu.Unlock() if s.dirAccess != nil { - return trace.AlreadyExists("directory is already shared for desktop %q and login", s.desktopName(), s.login) + return trace.AlreadyExists("directory is already shared for desktop %q and %q login", s.desktopName(), s.login) } dirAccess, err := NewDirectoryAccess(basePath) diff --git a/lib/teleterm/services/desktop/desktop_test.go b/lib/teleterm/services/desktop/desktop_test.go index b4b227e1e8310..bc59c2a7d3b59 100644 --- a/lib/teleterm/services/desktop/desktop_test.go +++ b/lib/teleterm/services/desktop/desktop_test.go @@ -1,3 +1,19 @@ +// Teleport +// Copyright (C) 2025 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + package desktop import ( From 63f34b7a7c1c263e64cae22ab54cb0a00740f59d Mon Sep 17 00:00:00 2001 From: Grzegorz Zdunek Date: Tue, 13 May 2025 13:52:57 +0200 Subject: [PATCH 11/14] Add missing defer for `s.dirAccessMu.RUnlock()` --- lib/teleterm/services/desktop/desktop.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/teleterm/services/desktop/desktop.go b/lib/teleterm/services/desktop/desktop.go index dcef1f9213b80..4b71beb6c508f 100644 --- a/lib/teleterm/services/desktop/desktop.go +++ b/lib/teleterm/services/desktop/desktop.go @@ -82,7 +82,7 @@ func (s *Session) SetSharedDirectory(basePath string) error { func (s *Session) GetDirectoryAccess() (*DirectoryAccess, error) { s.dirAccessMu.RLock() - s.dirAccessMu.RUnlock() + defer s.dirAccessMu.RUnlock() if s.dirAccess == nil { return nil, trace.NotFound("directory sharing has not been initialized for desktop %q and login %q", s.desktopName(), s.login) From 6a6660098deabeb7905cf0de1f43df919d6db748 Mon Sep 17 00:00:00 2001 From: Grzegorz Zdunek Date: Tue, 13 May 2025 18:44:14 +0200 Subject: [PATCH 12/14] `TestOpenSharedDirectory` -> `TestNewDirectoryAccess` --- .../services/desktop/directorysharing_test.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/teleterm/services/desktop/directorysharing_test.go b/lib/teleterm/services/desktop/directorysharing_test.go index 8fe3ec906f22a..d23e36a972fca 100644 --- a/lib/teleterm/services/desktop/directorysharing_test.go +++ b/lib/teleterm/services/desktop/directorysharing_test.go @@ -25,7 +25,13 @@ import ( "github.com/stretchr/testify/require" ) -func TestOpenSharedDirectory(t *testing.T) { +const ( + testDirname = "test_dir" + testFilename = "test_file" + testSymlinkFilename = "test_symlink" +) + +func TestNewDirectoryAccess(t *testing.T) { path := t.TempDir() filePath := filepath.Join(path, testFilename) err := os.WriteFile(filePath, []byte("test"), 0600) @@ -34,12 +40,6 @@ func TestOpenSharedDirectory(t *testing.T) { require.True(t, trace.IsBadParameter(err), "%q is not a directory", filePath) } -const ( - testDirname = "test_dir" - testFilename = "test_file" - testSymlinkFilename = "test_symlink" -) - func setUpSharedDir(t *testing.T) (*DirectoryAccess, string) { t.Helper() path := t.TempDir() From bd8f84c8b453ebf782fddd52f421ff040df0da56 Mon Sep 17 00:00:00 2001 From: Grzegorz Zdunek Date: Wed, 14 May 2025 10:58:30 +0200 Subject: [PATCH 13/14] Add a comment for JS file system handlers --- .../src/ui/DocumentDesktopSession/DocumentDesktopSession.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/web/packages/teleterm/src/ui/DocumentDesktopSession/DocumentDesktopSession.tsx b/web/packages/teleterm/src/ui/DocumentDesktopSession/DocumentDesktopSession.tsx index dc868e2612573..9cd24ee1e92f0 100644 --- a/web/packages/teleterm/src/ui/DocumentDesktopSession/DocumentDesktopSession.tsx +++ b/web/packages/teleterm/src/ui/DocumentDesktopSession/DocumentDesktopSession.tsx @@ -202,6 +202,8 @@ function makeTshdFileSystem( await mainProcessClient.selectDirectoryForDesktopSession(target); }, getDirectoryName: () => directoryName, + // These functions are unimplemented because all file system operations + // are handled exclusively by the tsh daemon. stat: () => { throw new NotImplemented(); }, From 875b85b6b1bbfb0766b50bc26f6773cb116956d6 Mon Sep 17 00:00:00 2001 From: Grzegorz Zdunek Date: Fri, 16 May 2025 11:52:25 +0200 Subject: [PATCH 14/14] `make grpc` --- .../go/teleport/lib/teleterm/v1/service.pb.go | 866 +++++++++++------- .../lib/teleterm/v1/service_grpc.pb.go | 40 + .../lib/teleterm/v1/service_pb.client.ts | 2 +- 3 files changed, 573 insertions(+), 335 deletions(-) diff --git a/gen/proto/go/teleport/lib/teleterm/v1/service.pb.go b/gen/proto/go/teleport/lib/teleterm/v1/service.pb.go index 15cc7c4a6353e..e6015d7758df3 100644 --- a/gen/proto/go/teleport/lib/teleterm/v1/service.pb.go +++ b/gen/proto/go/teleport/lib/teleterm/v1/service.pb.go @@ -2191,6 +2191,183 @@ func (x *ListDatabaseUsersResponse) GetUsers() []string { return nil } +// ListResourcesParams describes different types of params +// that can be applied when sending a request to a method that +// uses the ListResources API underneath. +type ListResourcesParams struct { + state protoimpl.MessageState `protogen:"open.v1"` + StartKey string `protobuf:"bytes,1,opt,name=start_key,json=startKey,proto3" json:"start_key,omitempty"` + Limit int32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` + PredicateExpression string `protobuf:"bytes,3,opt,name=predicate_expression,json=predicateExpression,proto3" json:"predicate_expression,omitempty"` + // UseSearchAsRoles indicates that the response should include all resources + // the caller is able to request access to using search_as_roles + UseSearchAsRoles bool `protobuf:"varint,4,opt,name=use_search_as_roles,json=useSearchAsRoles,proto3" json:"use_search_as_roles,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListResourcesParams) Reset() { + *x = ListResourcesParams{} + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListResourcesParams) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListResourcesParams) ProtoMessage() {} + +func (x *ListResourcesParams) ProtoReflect() protoreflect.Message { + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[36] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListResourcesParams.ProtoReflect.Descriptor instead. +func (*ListResourcesParams) Descriptor() ([]byte, []int) { + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{36} +} + +func (x *ListResourcesParams) GetStartKey() string { + if x != nil { + return x.StartKey + } + return "" +} + +func (x *ListResourcesParams) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *ListResourcesParams) GetPredicateExpression() string { + if x != nil { + return x.PredicateExpression + } + return "" +} + +func (x *ListResourcesParams) GetUseSearchAsRoles() bool { + if x != nil { + return x.UseSearchAsRoles + } + return false +} + +type ListDatabaseServersRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ClusterUri string `protobuf:"bytes,1,opt,name=cluster_uri,json=clusterUri,proto3" json:"cluster_uri,omitempty"` + Params *ListResourcesParams `protobuf:"bytes,2,opt,name=params,proto3" json:"params,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListDatabaseServersRequest) Reset() { + *x = ListDatabaseServersRequest{} + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListDatabaseServersRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListDatabaseServersRequest) ProtoMessage() {} + +func (x *ListDatabaseServersRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[37] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListDatabaseServersRequest.ProtoReflect.Descriptor instead. +func (*ListDatabaseServersRequest) Descriptor() ([]byte, []int) { + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{37} +} + +func (x *ListDatabaseServersRequest) GetClusterUri() string { + if x != nil { + return x.ClusterUri + } + return "" +} + +func (x *ListDatabaseServersRequest) GetParams() *ListResourcesParams { + if x != nil { + return x.Params + } + return nil +} + +type ListDatabaseServersResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Resources []*DatabaseServer `protobuf:"bytes,1,rep,name=resources,proto3" json:"resources,omitempty"` + NextKey string `protobuf:"bytes,2,opt,name=next_key,json=nextKey,proto3" json:"next_key,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListDatabaseServersResponse) Reset() { + *x = ListDatabaseServersResponse{} + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListDatabaseServersResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListDatabaseServersResponse) ProtoMessage() {} + +func (x *ListDatabaseServersResponse) ProtoReflect() protoreflect.Message { + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[38] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListDatabaseServersResponse.ProtoReflect.Descriptor instead. +func (*ListDatabaseServersResponse) Descriptor() ([]byte, []int) { + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{38} +} + +func (x *ListDatabaseServersResponse) GetResources() []*DatabaseServer { + if x != nil { + return x.Resources + } + return nil +} + +func (x *ListDatabaseServersResponse) GetNextKey() string { + if x != nil { + return x.NextKey + } + return "" +} + type CreateGatewayRequest struct { state protoimpl.MessageState `protogen:"open.v1"` TargetUri string `protobuf:"bytes,1,opt,name=target_uri,json=targetUri,proto3" json:"target_uri,omitempty"` @@ -2203,7 +2380,7 @@ type CreateGatewayRequest struct { func (x *CreateGatewayRequest) Reset() { *x = CreateGatewayRequest{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[36] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2215,7 +2392,7 @@ func (x *CreateGatewayRequest) String() string { func (*CreateGatewayRequest) ProtoMessage() {} func (x *CreateGatewayRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[36] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2228,7 +2405,7 @@ func (x *CreateGatewayRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateGatewayRequest.ProtoReflect.Descriptor instead. func (*CreateGatewayRequest) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{36} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{39} } func (x *CreateGatewayRequest) GetTargetUri() string { @@ -2267,7 +2444,7 @@ type ListGatewaysRequest struct { func (x *ListGatewaysRequest) Reset() { *x = ListGatewaysRequest{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[37] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2279,7 +2456,7 @@ func (x *ListGatewaysRequest) String() string { func (*ListGatewaysRequest) ProtoMessage() {} func (x *ListGatewaysRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[37] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2292,7 +2469,7 @@ func (x *ListGatewaysRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListGatewaysRequest.ProtoReflect.Descriptor instead. func (*ListGatewaysRequest) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{37} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{40} } type ListGatewaysResponse struct { @@ -2304,7 +2481,7 @@ type ListGatewaysResponse struct { func (x *ListGatewaysResponse) Reset() { *x = ListGatewaysResponse{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[38] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2316,7 +2493,7 @@ func (x *ListGatewaysResponse) String() string { func (*ListGatewaysResponse) ProtoMessage() {} func (x *ListGatewaysResponse) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[38] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2329,7 +2506,7 @@ func (x *ListGatewaysResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListGatewaysResponse.ProtoReflect.Descriptor instead. func (*ListGatewaysResponse) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{38} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{41} } func (x *ListGatewaysResponse) GetGateways() []*Gateway { @@ -2348,7 +2525,7 @@ type RemoveGatewayRequest struct { func (x *RemoveGatewayRequest) Reset() { *x = RemoveGatewayRequest{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[39] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2360,7 +2537,7 @@ func (x *RemoveGatewayRequest) String() string { func (*RemoveGatewayRequest) ProtoMessage() {} func (x *RemoveGatewayRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[39] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2373,7 +2550,7 @@ func (x *RemoveGatewayRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveGatewayRequest.ProtoReflect.Descriptor instead. func (*RemoveGatewayRequest) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{39} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{42} } func (x *RemoveGatewayRequest) GetGatewayUri() string { @@ -2393,7 +2570,7 @@ type SetGatewayTargetSubresourceNameRequest struct { func (x *SetGatewayTargetSubresourceNameRequest) Reset() { *x = SetGatewayTargetSubresourceNameRequest{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[40] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2405,7 +2582,7 @@ func (x *SetGatewayTargetSubresourceNameRequest) String() string { func (*SetGatewayTargetSubresourceNameRequest) ProtoMessage() {} func (x *SetGatewayTargetSubresourceNameRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[40] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2418,7 +2595,7 @@ func (x *SetGatewayTargetSubresourceNameRequest) ProtoReflect() protoreflect.Mes // Deprecated: Use SetGatewayTargetSubresourceNameRequest.ProtoReflect.Descriptor instead. func (*SetGatewayTargetSubresourceNameRequest) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{40} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{43} } func (x *SetGatewayTargetSubresourceNameRequest) GetGatewayUri() string { @@ -2445,7 +2622,7 @@ type SetGatewayLocalPortRequest struct { func (x *SetGatewayLocalPortRequest) Reset() { *x = SetGatewayLocalPortRequest{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[41] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2457,7 +2634,7 @@ func (x *SetGatewayLocalPortRequest) String() string { func (*SetGatewayLocalPortRequest) ProtoMessage() {} func (x *SetGatewayLocalPortRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[41] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2470,7 +2647,7 @@ func (x *SetGatewayLocalPortRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetGatewayLocalPortRequest.ProtoReflect.Descriptor instead. func (*SetGatewayLocalPortRequest) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{41} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{44} } func (x *SetGatewayLocalPortRequest) GetGatewayUri() string { @@ -2502,7 +2679,7 @@ type GetServersRequest struct { func (x *GetServersRequest) Reset() { *x = GetServersRequest{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[42] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2514,7 +2691,7 @@ func (x *GetServersRequest) String() string { func (*GetServersRequest) ProtoMessage() {} func (x *GetServersRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[42] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2527,7 +2704,7 @@ func (x *GetServersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetServersRequest.ProtoReflect.Descriptor instead. func (*GetServersRequest) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{42} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{45} } func (x *GetServersRequest) GetClusterUri() string { @@ -2590,7 +2767,7 @@ type GetServersResponse struct { func (x *GetServersResponse) Reset() { *x = GetServersResponse{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[43] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2602,7 +2779,7 @@ func (x *GetServersResponse) String() string { func (*GetServersResponse) ProtoMessage() {} func (x *GetServersResponse) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[43] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2615,7 +2792,7 @@ func (x *GetServersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetServersResponse.ProtoReflect.Descriptor instead. func (*GetServersResponse) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{43} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{46} } func (x *GetServersResponse) GetAgents() []*Server { @@ -2648,7 +2825,7 @@ type GetAuthSettingsRequest struct { func (x *GetAuthSettingsRequest) Reset() { *x = GetAuthSettingsRequest{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[44] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2660,7 +2837,7 @@ func (x *GetAuthSettingsRequest) String() string { func (*GetAuthSettingsRequest) ProtoMessage() {} func (x *GetAuthSettingsRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[44] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2673,7 +2850,7 @@ func (x *GetAuthSettingsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAuthSettingsRequest.ProtoReflect.Descriptor instead. func (*GetAuthSettingsRequest) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{44} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{47} } func (x *GetAuthSettingsRequest) GetClusterUri() string { @@ -2692,7 +2869,7 @@ type UpdateTshdEventsServerAddressRequest struct { func (x *UpdateTshdEventsServerAddressRequest) Reset() { *x = UpdateTshdEventsServerAddressRequest{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[45] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2704,7 +2881,7 @@ func (x *UpdateTshdEventsServerAddressRequest) String() string { func (*UpdateTshdEventsServerAddressRequest) ProtoMessage() {} func (x *UpdateTshdEventsServerAddressRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[45] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2717,7 +2894,7 @@ func (x *UpdateTshdEventsServerAddressRequest) ProtoReflect() protoreflect.Messa // Deprecated: Use UpdateTshdEventsServerAddressRequest.ProtoReflect.Descriptor instead. func (*UpdateTshdEventsServerAddressRequest) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{45} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{48} } func (x *UpdateTshdEventsServerAddressRequest) GetAddress() string { @@ -2735,7 +2912,7 @@ type UpdateTshdEventsServerAddressResponse struct { func (x *UpdateTshdEventsServerAddressResponse) Reset() { *x = UpdateTshdEventsServerAddressResponse{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[46] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2747,7 +2924,7 @@ func (x *UpdateTshdEventsServerAddressResponse) String() string { func (*UpdateTshdEventsServerAddressResponse) ProtoMessage() {} func (x *UpdateTshdEventsServerAddressResponse) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[46] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2760,7 +2937,7 @@ func (x *UpdateTshdEventsServerAddressResponse) ProtoReflect() protoreflect.Mess // Deprecated: Use UpdateTshdEventsServerAddressResponse.ProtoReflect.Descriptor instead. func (*UpdateTshdEventsServerAddressResponse) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{46} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{49} } type UpdateHeadlessAuthenticationStateRequest struct { @@ -2774,7 +2951,7 @@ type UpdateHeadlessAuthenticationStateRequest struct { func (x *UpdateHeadlessAuthenticationStateRequest) Reset() { *x = UpdateHeadlessAuthenticationStateRequest{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[47] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2786,7 +2963,7 @@ func (x *UpdateHeadlessAuthenticationStateRequest) String() string { func (*UpdateHeadlessAuthenticationStateRequest) ProtoMessage() {} func (x *UpdateHeadlessAuthenticationStateRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[47] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2799,7 +2976,7 @@ func (x *UpdateHeadlessAuthenticationStateRequest) ProtoReflect() protoreflect.M // Deprecated: Use UpdateHeadlessAuthenticationStateRequest.ProtoReflect.Descriptor instead. func (*UpdateHeadlessAuthenticationStateRequest) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{47} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{50} } func (x *UpdateHeadlessAuthenticationStateRequest) GetRootClusterUri() string { @@ -2831,7 +3008,7 @@ type UpdateHeadlessAuthenticationStateResponse struct { func (x *UpdateHeadlessAuthenticationStateResponse) Reset() { *x = UpdateHeadlessAuthenticationStateResponse{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[48] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2843,7 +3020,7 @@ func (x *UpdateHeadlessAuthenticationStateResponse) String() string { func (*UpdateHeadlessAuthenticationStateResponse) ProtoMessage() {} func (x *UpdateHeadlessAuthenticationStateResponse) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[48] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2856,7 +3033,7 @@ func (x *UpdateHeadlessAuthenticationStateResponse) ProtoReflect() protoreflect. // Deprecated: Use UpdateHeadlessAuthenticationStateResponse.ProtoReflect.Descriptor instead. func (*UpdateHeadlessAuthenticationStateResponse) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{48} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{51} } type CreateConnectMyComputerRoleRequest struct { @@ -2868,7 +3045,7 @@ type CreateConnectMyComputerRoleRequest struct { func (x *CreateConnectMyComputerRoleRequest) Reset() { *x = CreateConnectMyComputerRoleRequest{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[49] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2880,7 +3057,7 @@ func (x *CreateConnectMyComputerRoleRequest) String() string { func (*CreateConnectMyComputerRoleRequest) ProtoMessage() {} func (x *CreateConnectMyComputerRoleRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[49] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2893,7 +3070,7 @@ func (x *CreateConnectMyComputerRoleRequest) ProtoReflect() protoreflect.Message // Deprecated: Use CreateConnectMyComputerRoleRequest.ProtoReflect.Descriptor instead. func (*CreateConnectMyComputerRoleRequest) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{49} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{52} } func (x *CreateConnectMyComputerRoleRequest) GetRootClusterUri() string { @@ -2914,7 +3091,7 @@ type CreateConnectMyComputerRoleResponse struct { func (x *CreateConnectMyComputerRoleResponse) Reset() { *x = CreateConnectMyComputerRoleResponse{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[50] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2926,7 +3103,7 @@ func (x *CreateConnectMyComputerRoleResponse) String() string { func (*CreateConnectMyComputerRoleResponse) ProtoMessage() {} func (x *CreateConnectMyComputerRoleResponse) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[50] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2939,7 +3116,7 @@ func (x *CreateConnectMyComputerRoleResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use CreateConnectMyComputerRoleResponse.ProtoReflect.Descriptor instead. func (*CreateConnectMyComputerRoleResponse) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{50} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{53} } func (x *CreateConnectMyComputerRoleResponse) GetCertsReloaded() bool { @@ -2958,7 +3135,7 @@ type CreateConnectMyComputerNodeTokenRequest struct { func (x *CreateConnectMyComputerNodeTokenRequest) Reset() { *x = CreateConnectMyComputerNodeTokenRequest{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[51] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2970,7 +3147,7 @@ func (x *CreateConnectMyComputerNodeTokenRequest) String() string { func (*CreateConnectMyComputerNodeTokenRequest) ProtoMessage() {} func (x *CreateConnectMyComputerNodeTokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[51] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2983,7 +3160,7 @@ func (x *CreateConnectMyComputerNodeTokenRequest) ProtoReflect() protoreflect.Me // Deprecated: Use CreateConnectMyComputerNodeTokenRequest.ProtoReflect.Descriptor instead. func (*CreateConnectMyComputerNodeTokenRequest) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{51} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{54} } func (x *CreateConnectMyComputerNodeTokenRequest) GetRootClusterUri() string { @@ -3002,7 +3179,7 @@ type CreateConnectMyComputerNodeTokenResponse struct { func (x *CreateConnectMyComputerNodeTokenResponse) Reset() { *x = CreateConnectMyComputerNodeTokenResponse{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[52] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3014,7 +3191,7 @@ func (x *CreateConnectMyComputerNodeTokenResponse) String() string { func (*CreateConnectMyComputerNodeTokenResponse) ProtoMessage() {} func (x *CreateConnectMyComputerNodeTokenResponse) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[52] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3027,7 +3204,7 @@ func (x *CreateConnectMyComputerNodeTokenResponse) ProtoReflect() protoreflect.M // Deprecated: Use CreateConnectMyComputerNodeTokenResponse.ProtoReflect.Descriptor instead. func (*CreateConnectMyComputerNodeTokenResponse) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{52} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{55} } func (x *CreateConnectMyComputerNodeTokenResponse) GetToken() string { @@ -3046,7 +3223,7 @@ type WaitForConnectMyComputerNodeJoinRequest struct { func (x *WaitForConnectMyComputerNodeJoinRequest) Reset() { *x = WaitForConnectMyComputerNodeJoinRequest{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[53] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3058,7 +3235,7 @@ func (x *WaitForConnectMyComputerNodeJoinRequest) String() string { func (*WaitForConnectMyComputerNodeJoinRequest) ProtoMessage() {} func (x *WaitForConnectMyComputerNodeJoinRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[53] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3071,7 +3248,7 @@ func (x *WaitForConnectMyComputerNodeJoinRequest) ProtoReflect() protoreflect.Me // Deprecated: Use WaitForConnectMyComputerNodeJoinRequest.ProtoReflect.Descriptor instead. func (*WaitForConnectMyComputerNodeJoinRequest) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{53} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{56} } func (x *WaitForConnectMyComputerNodeJoinRequest) GetRootClusterUri() string { @@ -3090,7 +3267,7 @@ type WaitForConnectMyComputerNodeJoinResponse struct { func (x *WaitForConnectMyComputerNodeJoinResponse) Reset() { *x = WaitForConnectMyComputerNodeJoinResponse{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[54] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3102,7 +3279,7 @@ func (x *WaitForConnectMyComputerNodeJoinResponse) String() string { func (*WaitForConnectMyComputerNodeJoinResponse) ProtoMessage() {} func (x *WaitForConnectMyComputerNodeJoinResponse) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[54] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3115,7 +3292,7 @@ func (x *WaitForConnectMyComputerNodeJoinResponse) ProtoReflect() protoreflect.M // Deprecated: Use WaitForConnectMyComputerNodeJoinResponse.ProtoReflect.Descriptor instead. func (*WaitForConnectMyComputerNodeJoinResponse) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{54} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{57} } func (x *WaitForConnectMyComputerNodeJoinResponse) GetServer() *Server { @@ -3134,7 +3311,7 @@ type DeleteConnectMyComputerNodeRequest struct { func (x *DeleteConnectMyComputerNodeRequest) Reset() { *x = DeleteConnectMyComputerNodeRequest{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[55] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3146,7 +3323,7 @@ func (x *DeleteConnectMyComputerNodeRequest) String() string { func (*DeleteConnectMyComputerNodeRequest) ProtoMessage() {} func (x *DeleteConnectMyComputerNodeRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[55] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3159,7 +3336,7 @@ func (x *DeleteConnectMyComputerNodeRequest) ProtoReflect() protoreflect.Message // Deprecated: Use DeleteConnectMyComputerNodeRequest.ProtoReflect.Descriptor instead. func (*DeleteConnectMyComputerNodeRequest) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{55} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{58} } func (x *DeleteConnectMyComputerNodeRequest) GetRootClusterUri() string { @@ -3177,7 +3354,7 @@ type DeleteConnectMyComputerNodeResponse struct { func (x *DeleteConnectMyComputerNodeResponse) Reset() { *x = DeleteConnectMyComputerNodeResponse{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[56] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3189,7 +3366,7 @@ func (x *DeleteConnectMyComputerNodeResponse) String() string { func (*DeleteConnectMyComputerNodeResponse) ProtoMessage() {} func (x *DeleteConnectMyComputerNodeResponse) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[56] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3202,7 +3379,7 @@ func (x *DeleteConnectMyComputerNodeResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use DeleteConnectMyComputerNodeResponse.ProtoReflect.Descriptor instead. func (*DeleteConnectMyComputerNodeResponse) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{56} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{59} } type GetConnectMyComputerNodeNameRequest struct { @@ -3214,7 +3391,7 @@ type GetConnectMyComputerNodeNameRequest struct { func (x *GetConnectMyComputerNodeNameRequest) Reset() { *x = GetConnectMyComputerNodeNameRequest{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[57] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3226,7 +3403,7 @@ func (x *GetConnectMyComputerNodeNameRequest) String() string { func (*GetConnectMyComputerNodeNameRequest) ProtoMessage() {} func (x *GetConnectMyComputerNodeNameRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[57] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3239,7 +3416,7 @@ func (x *GetConnectMyComputerNodeNameRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use GetConnectMyComputerNodeNameRequest.ProtoReflect.Descriptor instead. func (*GetConnectMyComputerNodeNameRequest) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{57} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{60} } func (x *GetConnectMyComputerNodeNameRequest) GetRootClusterUri() string { @@ -3258,7 +3435,7 @@ type GetConnectMyComputerNodeNameResponse struct { func (x *GetConnectMyComputerNodeNameResponse) Reset() { *x = GetConnectMyComputerNodeNameResponse{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[58] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3270,7 +3447,7 @@ func (x *GetConnectMyComputerNodeNameResponse) String() string { func (*GetConnectMyComputerNodeNameResponse) ProtoMessage() {} func (x *GetConnectMyComputerNodeNameResponse) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[58] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3283,7 +3460,7 @@ func (x *GetConnectMyComputerNodeNameResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use GetConnectMyComputerNodeNameResponse.ProtoReflect.Descriptor instead. func (*GetConnectMyComputerNodeNameResponse) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{58} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{61} } func (x *GetConnectMyComputerNodeNameResponse) GetName() string { @@ -3323,7 +3500,7 @@ type ListUnifiedResourcesRequest struct { func (x *ListUnifiedResourcesRequest) Reset() { *x = ListUnifiedResourcesRequest{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[59] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3335,7 +3512,7 @@ func (x *ListUnifiedResourcesRequest) String() string { func (*ListUnifiedResourcesRequest) ProtoMessage() {} func (x *ListUnifiedResourcesRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[59] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3348,7 +3525,7 @@ func (x *ListUnifiedResourcesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListUnifiedResourcesRequest.ProtoReflect.Descriptor instead. func (*ListUnifiedResourcesRequest) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{59} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{62} } func (x *ListUnifiedResourcesRequest) GetClusterUri() string { @@ -3433,7 +3610,7 @@ type SortBy struct { func (x *SortBy) Reset() { *x = SortBy{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[60] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3445,7 +3622,7 @@ func (x *SortBy) String() string { func (*SortBy) ProtoMessage() {} func (x *SortBy) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[60] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3458,7 +3635,7 @@ func (x *SortBy) ProtoReflect() protoreflect.Message { // Deprecated: Use SortBy.ProtoReflect.Descriptor instead. func (*SortBy) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{60} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{63} } func (x *SortBy) GetIsDesc() bool { @@ -3478,7 +3655,7 @@ func (x *SortBy) GetField() string { type ListUnifiedResourcesResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Resources []*PaginatedResource `protobuf:"bytes,1,rep,name=resources,proto3" json:"resources,omitempty"` - // A key to use as start_key in a ListResourcesRequest to continue retrieving + // A key to use as start_key in a ListUnifiedResourcesRequest to continue retrieving // the next pages. If it is empty, there are no more pages. NextKey string `protobuf:"bytes,2,opt,name=next_key,json=nextKey,proto3" json:"next_key,omitempty"` unknownFields protoimpl.UnknownFields @@ -3487,7 +3664,7 @@ type ListUnifiedResourcesResponse struct { func (x *ListUnifiedResourcesResponse) Reset() { *x = ListUnifiedResourcesResponse{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[61] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3499,7 +3676,7 @@ func (x *ListUnifiedResourcesResponse) String() string { func (*ListUnifiedResourcesResponse) ProtoMessage() {} func (x *ListUnifiedResourcesResponse) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[61] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[64] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3512,7 +3689,7 @@ func (x *ListUnifiedResourcesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListUnifiedResourcesResponse.ProtoReflect.Descriptor instead. func (*ListUnifiedResourcesResponse) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{61} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{64} } func (x *ListUnifiedResourcesResponse) GetResources() []*PaginatedResource { @@ -3546,7 +3723,7 @@ type PaginatedResource struct { func (x *PaginatedResource) Reset() { *x = PaginatedResource{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[62] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3558,7 +3735,7 @@ func (x *PaginatedResource) String() string { func (*PaginatedResource) ProtoMessage() {} func (x *PaginatedResource) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[62] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3571,7 +3748,7 @@ func (x *PaginatedResource) ProtoReflect() protoreflect.Message { // Deprecated: Use PaginatedResource.ProtoReflect.Descriptor instead. func (*PaginatedResource) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{62} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{65} } func (x *PaginatedResource) GetResource() isPaginatedResource_Resource { @@ -3676,7 +3853,7 @@ type GetUserPreferencesRequest struct { func (x *GetUserPreferencesRequest) Reset() { *x = GetUserPreferencesRequest{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[63] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3688,7 +3865,7 @@ func (x *GetUserPreferencesRequest) String() string { func (*GetUserPreferencesRequest) ProtoMessage() {} func (x *GetUserPreferencesRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[63] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[66] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3701,7 +3878,7 @@ func (x *GetUserPreferencesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUserPreferencesRequest.ProtoReflect.Descriptor instead. func (*GetUserPreferencesRequest) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{63} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{66} } func (x *GetUserPreferencesRequest) GetClusterUri() string { @@ -3720,7 +3897,7 @@ type GetUserPreferencesResponse struct { func (x *GetUserPreferencesResponse) Reset() { *x = GetUserPreferencesResponse{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[64] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3732,7 +3909,7 @@ func (x *GetUserPreferencesResponse) String() string { func (*GetUserPreferencesResponse) ProtoMessage() {} func (x *GetUserPreferencesResponse) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[64] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[67] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3745,7 +3922,7 @@ func (x *GetUserPreferencesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUserPreferencesResponse.ProtoReflect.Descriptor instead. func (*GetUserPreferencesResponse) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{64} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{67} } func (x *GetUserPreferencesResponse) GetUserPreferences() *UserPreferences { @@ -3765,7 +3942,7 @@ type UpdateUserPreferencesRequest struct { func (x *UpdateUserPreferencesRequest) Reset() { *x = UpdateUserPreferencesRequest{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[65] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3777,7 +3954,7 @@ func (x *UpdateUserPreferencesRequest) String() string { func (*UpdateUserPreferencesRequest) ProtoMessage() {} func (x *UpdateUserPreferencesRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[65] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[68] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3790,7 +3967,7 @@ func (x *UpdateUserPreferencesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateUserPreferencesRequest.ProtoReflect.Descriptor instead. func (*UpdateUserPreferencesRequest) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{65} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{68} } func (x *UpdateUserPreferencesRequest) GetClusterUri() string { @@ -3816,7 +3993,7 @@ type UpdateUserPreferencesResponse struct { func (x *UpdateUserPreferencesResponse) Reset() { *x = UpdateUserPreferencesResponse{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[66] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3828,7 +4005,7 @@ func (x *UpdateUserPreferencesResponse) String() string { func (*UpdateUserPreferencesResponse) ProtoMessage() {} func (x *UpdateUserPreferencesResponse) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[66] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[69] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3841,7 +4018,7 @@ func (x *UpdateUserPreferencesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateUserPreferencesResponse.ProtoReflect.Descriptor instead. func (*UpdateUserPreferencesResponse) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{66} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{69} } func (x *UpdateUserPreferencesResponse) GetUserPreferences() *UserPreferences { @@ -3863,7 +4040,7 @@ type UserPreferences struct { func (x *UserPreferences) Reset() { *x = UserPreferences{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[67] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3875,7 +4052,7 @@ func (x *UserPreferences) String() string { func (*UserPreferences) ProtoMessage() {} func (x *UserPreferences) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[67] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[70] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3888,7 +4065,7 @@ func (x *UserPreferences) ProtoReflect() protoreflect.Message { // Deprecated: Use UserPreferences.ProtoReflect.Descriptor instead. func (*UserPreferences) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{67} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{70} } func (x *UserPreferences) GetClusterPreferences() *v11.ClusterUserPreferences { @@ -3918,7 +4095,7 @@ type AuthenticateWebDeviceRequest struct { func (x *AuthenticateWebDeviceRequest) Reset() { *x = AuthenticateWebDeviceRequest{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[68] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3930,7 +4107,7 @@ func (x *AuthenticateWebDeviceRequest) String() string { func (*AuthenticateWebDeviceRequest) ProtoMessage() {} func (x *AuthenticateWebDeviceRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[68] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[71] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3943,7 +4120,7 @@ func (x *AuthenticateWebDeviceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AuthenticateWebDeviceRequest.ProtoReflect.Descriptor instead. func (*AuthenticateWebDeviceRequest) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{68} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{71} } func (x *AuthenticateWebDeviceRequest) GetDeviceWebToken() *v12.DeviceWebToken { @@ -3972,7 +4149,7 @@ type AuthenticateWebDeviceResponse struct { func (x *AuthenticateWebDeviceResponse) Reset() { *x = AuthenticateWebDeviceResponse{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[69] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3984,7 +4161,7 @@ func (x *AuthenticateWebDeviceResponse) String() string { func (*AuthenticateWebDeviceResponse) ProtoMessage() {} func (x *AuthenticateWebDeviceResponse) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[69] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[72] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3997,7 +4174,7 @@ func (x *AuthenticateWebDeviceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AuthenticateWebDeviceResponse.ProtoReflect.Descriptor instead. func (*AuthenticateWebDeviceResponse) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{69} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{72} } func (x *AuthenticateWebDeviceResponse) GetConfirmationToken() *v12.DeviceConfirmationToken { @@ -4016,7 +4193,7 @@ type GetAppRequest struct { func (x *GetAppRequest) Reset() { *x = GetAppRequest{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[70] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4028,7 +4205,7 @@ func (x *GetAppRequest) String() string { func (*GetAppRequest) ProtoMessage() {} func (x *GetAppRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[70] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[73] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4041,7 +4218,7 @@ func (x *GetAppRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAppRequest.ProtoReflect.Descriptor instead. func (*GetAppRequest) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{70} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{73} } func (x *GetAppRequest) GetAppUri() string { @@ -4060,7 +4237,7 @@ type GetAppResponse struct { func (x *GetAppResponse) Reset() { *x = GetAppResponse{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[71] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4072,7 +4249,7 @@ func (x *GetAppResponse) String() string { func (*GetAppResponse) ProtoMessage() {} func (x *GetAppResponse) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[71] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[74] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4085,7 +4262,7 @@ func (x *GetAppResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAppResponse.ProtoReflect.Descriptor instead. func (*GetAppResponse) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{71} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{74} } func (x *GetAppResponse) GetApp() *App { @@ -4108,7 +4285,7 @@ type TargetDesktop struct { func (x *TargetDesktop) Reset() { *x = TargetDesktop{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[72] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4120,7 +4297,7 @@ func (x *TargetDesktop) String() string { func (*TargetDesktop) ProtoMessage() {} func (x *TargetDesktop) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[72] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[75] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4133,7 +4310,7 @@ func (x *TargetDesktop) ProtoReflect() protoreflect.Message { // Deprecated: Use TargetDesktop.ProtoReflect.Descriptor instead. func (*TargetDesktop) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{72} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{75} } func (x *TargetDesktop) GetDesktopUri() string { @@ -4164,7 +4341,7 @@ type ConnectToDesktopRequest struct { func (x *ConnectToDesktopRequest) Reset() { *x = ConnectToDesktopRequest{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[73] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4176,7 +4353,7 @@ func (x *ConnectToDesktopRequest) String() string { func (*ConnectToDesktopRequest) ProtoMessage() {} func (x *ConnectToDesktopRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[73] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[76] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4189,7 +4366,7 @@ func (x *ConnectToDesktopRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ConnectToDesktopRequest.ProtoReflect.Descriptor instead. func (*ConnectToDesktopRequest) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{73} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{76} } func (x *ConnectToDesktopRequest) GetData() []byte { @@ -4217,7 +4394,7 @@ type ConnectToDesktopResponse struct { func (x *ConnectToDesktopResponse) Reset() { *x = ConnectToDesktopResponse{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[74] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4229,7 +4406,7 @@ func (x *ConnectToDesktopResponse) String() string { func (*ConnectToDesktopResponse) ProtoMessage() {} func (x *ConnectToDesktopResponse) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[74] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[77] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4242,7 +4419,7 @@ func (x *ConnectToDesktopResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ConnectToDesktopResponse.ProtoReflect.Descriptor instead. func (*ConnectToDesktopResponse) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{74} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{77} } func (x *ConnectToDesktopResponse) GetData() []byte { @@ -4267,7 +4444,7 @@ type SetSharedDirectoryForDesktopSessionRequest struct { func (x *SetSharedDirectoryForDesktopSessionRequest) Reset() { *x = SetSharedDirectoryForDesktopSessionRequest{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[75] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4279,7 +4456,7 @@ func (x *SetSharedDirectoryForDesktopSessionRequest) String() string { func (*SetSharedDirectoryForDesktopSessionRequest) ProtoMessage() {} func (x *SetSharedDirectoryForDesktopSessionRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[75] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[78] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4292,7 +4469,7 @@ func (x *SetSharedDirectoryForDesktopSessionRequest) ProtoReflect() protoreflect // Deprecated: Use SetSharedDirectoryForDesktopSessionRequest.ProtoReflect.Descriptor instead. func (*SetSharedDirectoryForDesktopSessionRequest) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{75} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{78} } func (x *SetSharedDirectoryForDesktopSessionRequest) GetDesktopUri() string { @@ -4325,7 +4502,7 @@ type SetSharedDirectoryForDesktopSessionResponse struct { func (x *SetSharedDirectoryForDesktopSessionResponse) Reset() { *x = SetSharedDirectoryForDesktopSessionResponse{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[76] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4337,7 +4514,7 @@ func (x *SetSharedDirectoryForDesktopSessionResponse) String() string { func (*SetSharedDirectoryForDesktopSessionResponse) ProtoMessage() {} func (x *SetSharedDirectoryForDesktopSessionResponse) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[76] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[79] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4350,7 +4527,7 @@ func (x *SetSharedDirectoryForDesktopSessionResponse) ProtoReflect() protoreflec // Deprecated: Use SetSharedDirectoryForDesktopSessionResponse.ProtoReflect.Descriptor instead. func (*SetSharedDirectoryForDesktopSessionResponse) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{76} + return file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP(), []int{79} } // LoginPasswordlessRequestInit contains fields needed to init the stream request. @@ -4364,7 +4541,7 @@ type LoginPasswordlessRequest_LoginPasswordlessRequestInit struct { func (x *LoginPasswordlessRequest_LoginPasswordlessRequestInit) Reset() { *x = LoginPasswordlessRequest_LoginPasswordlessRequestInit{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[77] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4376,7 +4553,7 @@ func (x *LoginPasswordlessRequest_LoginPasswordlessRequestInit) String() string func (*LoginPasswordlessRequest_LoginPasswordlessRequestInit) ProtoMessage() {} func (x *LoginPasswordlessRequest_LoginPasswordlessRequestInit) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[77] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[80] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4410,7 +4587,7 @@ type LoginPasswordlessRequest_LoginPasswordlessPINResponse struct { func (x *LoginPasswordlessRequest_LoginPasswordlessPINResponse) Reset() { *x = LoginPasswordlessRequest_LoginPasswordlessPINResponse{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[78] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4422,7 +4599,7 @@ func (x *LoginPasswordlessRequest_LoginPasswordlessPINResponse) String() string func (*LoginPasswordlessRequest_LoginPasswordlessPINResponse) ProtoMessage() {} func (x *LoginPasswordlessRequest_LoginPasswordlessPINResponse) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[78] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[81] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4458,7 +4635,7 @@ type LoginPasswordlessRequest_LoginPasswordlessCredentialResponse struct { func (x *LoginPasswordlessRequest_LoginPasswordlessCredentialResponse) Reset() { *x = LoginPasswordlessRequest_LoginPasswordlessCredentialResponse{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[79] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4470,7 +4647,7 @@ func (x *LoginPasswordlessRequest_LoginPasswordlessCredentialResponse) String() func (*LoginPasswordlessRequest_LoginPasswordlessCredentialResponse) ProtoMessage() {} func (x *LoginPasswordlessRequest_LoginPasswordlessCredentialResponse) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[79] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[82] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4508,7 +4685,7 @@ type LoginRequest_LocalParams struct { func (x *LoginRequest_LocalParams) Reset() { *x = LoginRequest_LocalParams{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[80] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4520,7 +4697,7 @@ func (x *LoginRequest_LocalParams) String() string { func (*LoginRequest_LocalParams) ProtoMessage() {} func (x *LoginRequest_LocalParams) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[80] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[83] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4570,7 +4747,7 @@ type LoginRequest_SsoParams struct { func (x *LoginRequest_SsoParams) Reset() { *x = LoginRequest_SsoParams{} - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[81] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4582,7 +4759,7 @@ func (x *LoginRequest_SsoParams) String() string { func (*LoginRequest_SsoParams) ProtoMessage() {} func (x *LoginRequest_SsoParams) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[81] + mi := &file_teleport_lib_teleterm_v1_service_proto_msgTypes[84] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4756,7 +4933,19 @@ const file_teleport_lib_teleterm_v1_service_proto_rawDesc = "" + "\x18ListDatabaseUsersRequest\x12\x15\n" + "\x06db_uri\x18\x01 \x01(\tR\x05dbUri\"1\n" + "\x19ListDatabaseUsersResponse\x12\x14\n" + - "\x05users\x18\x01 \x03(\tR\x05users\"\xad\x01\n" + + "\x05users\x18\x01 \x03(\tR\x05users\"\xaa\x01\n" + + "\x13ListResourcesParams\x12\x1b\n" + + "\tstart_key\x18\x01 \x01(\tR\bstartKey\x12\x14\n" + + "\x05limit\x18\x02 \x01(\x05R\x05limit\x121\n" + + "\x14predicate_expression\x18\x03 \x01(\tR\x13predicateExpression\x12-\n" + + "\x13use_search_as_roles\x18\x04 \x01(\bR\x10useSearchAsRoles\"\x84\x01\n" + + "\x1aListDatabaseServersRequest\x12\x1f\n" + + "\vcluster_uri\x18\x01 \x01(\tR\n" + + "clusterUri\x12E\n" + + "\x06params\x18\x02 \x01(\v2-.teleport.lib.teleterm.v1.ListResourcesParamsR\x06params\"\x80\x01\n" + + "\x1bListDatabaseServersResponse\x12F\n" + + "\tresources\x18\x01 \x03(\v2(.teleport.lib.teleterm.v1.DatabaseServerR\tresources\x12\x19\n" + + "\bnext_key\x18\x02 \x01(\tR\anextKey\"\xad\x01\n" + "\x14CreateGatewayRequest\x12\x1d\n" + "\n" + "target_uri\x18\x01 \x01(\tR\ttargetUri\x12\x1f\n" + @@ -4904,13 +5093,14 @@ const file_teleport_lib_teleterm_v1_service_proto_rawDesc = "" + ")HEADLESS_AUTHENTICATION_STATE_UNSPECIFIED\x10\x00\x12)\n" + "%HEADLESS_AUTHENTICATION_STATE_PENDING\x10\x01\x12(\n" + "$HEADLESS_AUTHENTICATION_STATE_DENIED\x10\x02\x12*\n" + - "&HEADLESS_AUTHENTICATION_STATE_APPROVED\x10\x032\x92+\n" + + "&HEADLESS_AUTHENTICATION_STATE_APPROVED\x10\x032\x97,\n" + "\x0fTerminalService\x12\xa0\x01\n" + "\x1dUpdateTshdEventsServerAddress\x12>.teleport.lib.teleterm.v1.UpdateTshdEventsServerAddressRequest\x1a?.teleport.lib.teleterm.v1.UpdateTshdEventsServerAddressResponse\x12q\n" + "\x10ListRootClusters\x12-.teleport.lib.teleterm.v1.ListClustersRequest\x1a..teleport.lib.teleterm.v1.ListClustersResponse\x12u\n" + "\x10ListLeafClusters\x121.teleport.lib.teleterm.v1.ListLeafClustersRequest\x1a..teleport.lib.teleterm.v1.ListClustersResponse\x12\x85\x01\n" + "\x14StartHeadlessWatcher\x125.teleport.lib.teleterm.v1.StartHeadlessWatcherRequest\x1a6.teleport.lib.teleterm.v1.StartHeadlessWatcherResponse\x12|\n" + - "\x11ListDatabaseUsers\x122.teleport.lib.teleterm.v1.ListDatabaseUsersRequest\x1a3.teleport.lib.teleterm.v1.ListDatabaseUsersResponse\x12l\n" + + "\x11ListDatabaseUsers\x122.teleport.lib.teleterm.v1.ListDatabaseUsersRequest\x1a3.teleport.lib.teleterm.v1.ListDatabaseUsersResponse\x12\x82\x01\n" + + "\x13ListDatabaseServers\x124.teleport.lib.teleterm.v1.ListDatabaseServersRequest\x1a5.teleport.lib.teleterm.v1.ListDatabaseServersResponse\x12l\n" + "\n" + "GetServers\x12+.teleport.lib.teleterm.v1.GetServersRequest\x1a,.teleport.lib.teleterm.v1.GetServersResponse\"\x03\x88\x02\x01\x12|\n" + "\x11GetAccessRequests\x122.teleport.lib.teleterm.v1.GetAccessRequestsRequest\x1a3.teleport.lib.teleterm.v1.GetAccessRequestsResponse\x12y\n" + @@ -4967,7 +5157,7 @@ func file_teleport_lib_teleterm_v1_service_proto_rawDescGZIP() []byte { } var file_teleport_lib_teleterm_v1_service_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_teleport_lib_teleterm_v1_service_proto_msgTypes = make([]protoimpl.MessageInfo, 82) +var file_teleport_lib_teleterm_v1_service_proto_msgTypes = make([]protoimpl.MessageInfo, 85) var file_teleport_lib_teleterm_v1_service_proto_goTypes = []any{ (PasswordlessPrompt)(0), // 0: teleport.lib.teleterm.v1.PasswordlessPrompt (FileTransferDirection)(0), // 1: teleport.lib.teleterm.v1.FileTransferDirection @@ -5008,205 +5198,213 @@ var file_teleport_lib_teleterm_v1_service_proto_goTypes = []any{ (*ListLeafClustersRequest)(nil), // 36: teleport.lib.teleterm.v1.ListLeafClustersRequest (*ListDatabaseUsersRequest)(nil), // 37: teleport.lib.teleterm.v1.ListDatabaseUsersRequest (*ListDatabaseUsersResponse)(nil), // 38: teleport.lib.teleterm.v1.ListDatabaseUsersResponse - (*CreateGatewayRequest)(nil), // 39: teleport.lib.teleterm.v1.CreateGatewayRequest - (*ListGatewaysRequest)(nil), // 40: teleport.lib.teleterm.v1.ListGatewaysRequest - (*ListGatewaysResponse)(nil), // 41: teleport.lib.teleterm.v1.ListGatewaysResponse - (*RemoveGatewayRequest)(nil), // 42: teleport.lib.teleterm.v1.RemoveGatewayRequest - (*SetGatewayTargetSubresourceNameRequest)(nil), // 43: teleport.lib.teleterm.v1.SetGatewayTargetSubresourceNameRequest - (*SetGatewayLocalPortRequest)(nil), // 44: teleport.lib.teleterm.v1.SetGatewayLocalPortRequest - (*GetServersRequest)(nil), // 45: teleport.lib.teleterm.v1.GetServersRequest - (*GetServersResponse)(nil), // 46: teleport.lib.teleterm.v1.GetServersResponse - (*GetAuthSettingsRequest)(nil), // 47: teleport.lib.teleterm.v1.GetAuthSettingsRequest - (*UpdateTshdEventsServerAddressRequest)(nil), // 48: teleport.lib.teleterm.v1.UpdateTshdEventsServerAddressRequest - (*UpdateTshdEventsServerAddressResponse)(nil), // 49: teleport.lib.teleterm.v1.UpdateTshdEventsServerAddressResponse - (*UpdateHeadlessAuthenticationStateRequest)(nil), // 50: teleport.lib.teleterm.v1.UpdateHeadlessAuthenticationStateRequest - (*UpdateHeadlessAuthenticationStateResponse)(nil), // 51: teleport.lib.teleterm.v1.UpdateHeadlessAuthenticationStateResponse - (*CreateConnectMyComputerRoleRequest)(nil), // 52: teleport.lib.teleterm.v1.CreateConnectMyComputerRoleRequest - (*CreateConnectMyComputerRoleResponse)(nil), // 53: teleport.lib.teleterm.v1.CreateConnectMyComputerRoleResponse - (*CreateConnectMyComputerNodeTokenRequest)(nil), // 54: teleport.lib.teleterm.v1.CreateConnectMyComputerNodeTokenRequest - (*CreateConnectMyComputerNodeTokenResponse)(nil), // 55: teleport.lib.teleterm.v1.CreateConnectMyComputerNodeTokenResponse - (*WaitForConnectMyComputerNodeJoinRequest)(nil), // 56: teleport.lib.teleterm.v1.WaitForConnectMyComputerNodeJoinRequest - (*WaitForConnectMyComputerNodeJoinResponse)(nil), // 57: teleport.lib.teleterm.v1.WaitForConnectMyComputerNodeJoinResponse - (*DeleteConnectMyComputerNodeRequest)(nil), // 58: teleport.lib.teleterm.v1.DeleteConnectMyComputerNodeRequest - (*DeleteConnectMyComputerNodeResponse)(nil), // 59: teleport.lib.teleterm.v1.DeleteConnectMyComputerNodeResponse - (*GetConnectMyComputerNodeNameRequest)(nil), // 60: teleport.lib.teleterm.v1.GetConnectMyComputerNodeNameRequest - (*GetConnectMyComputerNodeNameResponse)(nil), // 61: teleport.lib.teleterm.v1.GetConnectMyComputerNodeNameResponse - (*ListUnifiedResourcesRequest)(nil), // 62: teleport.lib.teleterm.v1.ListUnifiedResourcesRequest - (*SortBy)(nil), // 63: teleport.lib.teleterm.v1.SortBy - (*ListUnifiedResourcesResponse)(nil), // 64: teleport.lib.teleterm.v1.ListUnifiedResourcesResponse - (*PaginatedResource)(nil), // 65: teleport.lib.teleterm.v1.PaginatedResource - (*GetUserPreferencesRequest)(nil), // 66: teleport.lib.teleterm.v1.GetUserPreferencesRequest - (*GetUserPreferencesResponse)(nil), // 67: teleport.lib.teleterm.v1.GetUserPreferencesResponse - (*UpdateUserPreferencesRequest)(nil), // 68: teleport.lib.teleterm.v1.UpdateUserPreferencesRequest - (*UpdateUserPreferencesResponse)(nil), // 69: teleport.lib.teleterm.v1.UpdateUserPreferencesResponse - (*UserPreferences)(nil), // 70: teleport.lib.teleterm.v1.UserPreferences - (*AuthenticateWebDeviceRequest)(nil), // 71: teleport.lib.teleterm.v1.AuthenticateWebDeviceRequest - (*AuthenticateWebDeviceResponse)(nil), // 72: teleport.lib.teleterm.v1.AuthenticateWebDeviceResponse - (*GetAppRequest)(nil), // 73: teleport.lib.teleterm.v1.GetAppRequest - (*GetAppResponse)(nil), // 74: teleport.lib.teleterm.v1.GetAppResponse - (*TargetDesktop)(nil), // 75: teleport.lib.teleterm.v1.TargetDesktop - (*ConnectToDesktopRequest)(nil), // 76: teleport.lib.teleterm.v1.ConnectToDesktopRequest - (*ConnectToDesktopResponse)(nil), // 77: teleport.lib.teleterm.v1.ConnectToDesktopResponse - (*SetSharedDirectoryForDesktopSessionRequest)(nil), // 78: teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionRequest - (*SetSharedDirectoryForDesktopSessionResponse)(nil), // 79: teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionResponse - (*LoginPasswordlessRequest_LoginPasswordlessRequestInit)(nil), // 80: teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessRequestInit - (*LoginPasswordlessRequest_LoginPasswordlessPINResponse)(nil), // 81: teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessPINResponse - (*LoginPasswordlessRequest_LoginPasswordlessCredentialResponse)(nil), // 82: teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessCredentialResponse - (*LoginRequest_LocalParams)(nil), // 83: teleport.lib.teleterm.v1.LoginRequest.LocalParams - (*LoginRequest_SsoParams)(nil), // 84: teleport.lib.teleterm.v1.LoginRequest.SsoParams - (*AccessRequest)(nil), // 85: teleport.lib.teleterm.v1.AccessRequest - (*ResourceID)(nil), // 86: teleport.lib.teleterm.v1.ResourceID - (*timestamppb.Timestamp)(nil), // 87: google.protobuf.Timestamp - (*v1.AccessList)(nil), // 88: teleport.accesslist.v1.AccessList - (*KubeResource)(nil), // 89: teleport.lib.teleterm.v1.KubeResource - (*Cluster)(nil), // 90: teleport.lib.teleterm.v1.Cluster - (*Gateway)(nil), // 91: teleport.lib.teleterm.v1.Gateway - (*Server)(nil), // 92: teleport.lib.teleterm.v1.Server - (*Database)(nil), // 93: teleport.lib.teleterm.v1.Database - (*Kube)(nil), // 94: teleport.lib.teleterm.v1.Kube - (*App)(nil), // 95: teleport.lib.teleterm.v1.App - (*WindowsDesktop)(nil), // 96: teleport.lib.teleterm.v1.WindowsDesktop - (*v11.ClusterUserPreferences)(nil), // 97: teleport.userpreferences.v1.ClusterUserPreferences - (*v11.UnifiedResourcePreferences)(nil), // 98: teleport.userpreferences.v1.UnifiedResourcePreferences - (*v12.DeviceWebToken)(nil), // 99: teleport.devicetrust.v1.DeviceWebToken - (*v12.DeviceConfirmationToken)(nil), // 100: teleport.devicetrust.v1.DeviceConfirmationToken - (*ReportUsageEventRequest)(nil), // 101: teleport.lib.teleterm.v1.ReportUsageEventRequest - (*AuthSettings)(nil), // 102: teleport.lib.teleterm.v1.AuthSettings + (*ListResourcesParams)(nil), // 39: teleport.lib.teleterm.v1.ListResourcesParams + (*ListDatabaseServersRequest)(nil), // 40: teleport.lib.teleterm.v1.ListDatabaseServersRequest + (*ListDatabaseServersResponse)(nil), // 41: teleport.lib.teleterm.v1.ListDatabaseServersResponse + (*CreateGatewayRequest)(nil), // 42: teleport.lib.teleterm.v1.CreateGatewayRequest + (*ListGatewaysRequest)(nil), // 43: teleport.lib.teleterm.v1.ListGatewaysRequest + (*ListGatewaysResponse)(nil), // 44: teleport.lib.teleterm.v1.ListGatewaysResponse + (*RemoveGatewayRequest)(nil), // 45: teleport.lib.teleterm.v1.RemoveGatewayRequest + (*SetGatewayTargetSubresourceNameRequest)(nil), // 46: teleport.lib.teleterm.v1.SetGatewayTargetSubresourceNameRequest + (*SetGatewayLocalPortRequest)(nil), // 47: teleport.lib.teleterm.v1.SetGatewayLocalPortRequest + (*GetServersRequest)(nil), // 48: teleport.lib.teleterm.v1.GetServersRequest + (*GetServersResponse)(nil), // 49: teleport.lib.teleterm.v1.GetServersResponse + (*GetAuthSettingsRequest)(nil), // 50: teleport.lib.teleterm.v1.GetAuthSettingsRequest + (*UpdateTshdEventsServerAddressRequest)(nil), // 51: teleport.lib.teleterm.v1.UpdateTshdEventsServerAddressRequest + (*UpdateTshdEventsServerAddressResponse)(nil), // 52: teleport.lib.teleterm.v1.UpdateTshdEventsServerAddressResponse + (*UpdateHeadlessAuthenticationStateRequest)(nil), // 53: teleport.lib.teleterm.v1.UpdateHeadlessAuthenticationStateRequest + (*UpdateHeadlessAuthenticationStateResponse)(nil), // 54: teleport.lib.teleterm.v1.UpdateHeadlessAuthenticationStateResponse + (*CreateConnectMyComputerRoleRequest)(nil), // 55: teleport.lib.teleterm.v1.CreateConnectMyComputerRoleRequest + (*CreateConnectMyComputerRoleResponse)(nil), // 56: teleport.lib.teleterm.v1.CreateConnectMyComputerRoleResponse + (*CreateConnectMyComputerNodeTokenRequest)(nil), // 57: teleport.lib.teleterm.v1.CreateConnectMyComputerNodeTokenRequest + (*CreateConnectMyComputerNodeTokenResponse)(nil), // 58: teleport.lib.teleterm.v1.CreateConnectMyComputerNodeTokenResponse + (*WaitForConnectMyComputerNodeJoinRequest)(nil), // 59: teleport.lib.teleterm.v1.WaitForConnectMyComputerNodeJoinRequest + (*WaitForConnectMyComputerNodeJoinResponse)(nil), // 60: teleport.lib.teleterm.v1.WaitForConnectMyComputerNodeJoinResponse + (*DeleteConnectMyComputerNodeRequest)(nil), // 61: teleport.lib.teleterm.v1.DeleteConnectMyComputerNodeRequest + (*DeleteConnectMyComputerNodeResponse)(nil), // 62: teleport.lib.teleterm.v1.DeleteConnectMyComputerNodeResponse + (*GetConnectMyComputerNodeNameRequest)(nil), // 63: teleport.lib.teleterm.v1.GetConnectMyComputerNodeNameRequest + (*GetConnectMyComputerNodeNameResponse)(nil), // 64: teleport.lib.teleterm.v1.GetConnectMyComputerNodeNameResponse + (*ListUnifiedResourcesRequest)(nil), // 65: teleport.lib.teleterm.v1.ListUnifiedResourcesRequest + (*SortBy)(nil), // 66: teleport.lib.teleterm.v1.SortBy + (*ListUnifiedResourcesResponse)(nil), // 67: teleport.lib.teleterm.v1.ListUnifiedResourcesResponse + (*PaginatedResource)(nil), // 68: teleport.lib.teleterm.v1.PaginatedResource + (*GetUserPreferencesRequest)(nil), // 69: teleport.lib.teleterm.v1.GetUserPreferencesRequest + (*GetUserPreferencesResponse)(nil), // 70: teleport.lib.teleterm.v1.GetUserPreferencesResponse + (*UpdateUserPreferencesRequest)(nil), // 71: teleport.lib.teleterm.v1.UpdateUserPreferencesRequest + (*UpdateUserPreferencesResponse)(nil), // 72: teleport.lib.teleterm.v1.UpdateUserPreferencesResponse + (*UserPreferences)(nil), // 73: teleport.lib.teleterm.v1.UserPreferences + (*AuthenticateWebDeviceRequest)(nil), // 74: teleport.lib.teleterm.v1.AuthenticateWebDeviceRequest + (*AuthenticateWebDeviceResponse)(nil), // 75: teleport.lib.teleterm.v1.AuthenticateWebDeviceResponse + (*GetAppRequest)(nil), // 76: teleport.lib.teleterm.v1.GetAppRequest + (*GetAppResponse)(nil), // 77: teleport.lib.teleterm.v1.GetAppResponse + (*TargetDesktop)(nil), // 78: teleport.lib.teleterm.v1.TargetDesktop + (*ConnectToDesktopRequest)(nil), // 79: teleport.lib.teleterm.v1.ConnectToDesktopRequest + (*ConnectToDesktopResponse)(nil), // 80: teleport.lib.teleterm.v1.ConnectToDesktopResponse + (*SetSharedDirectoryForDesktopSessionRequest)(nil), // 81: teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionRequest + (*SetSharedDirectoryForDesktopSessionResponse)(nil), // 82: teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionResponse + (*LoginPasswordlessRequest_LoginPasswordlessRequestInit)(nil), // 83: teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessRequestInit + (*LoginPasswordlessRequest_LoginPasswordlessPINResponse)(nil), // 84: teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessPINResponse + (*LoginPasswordlessRequest_LoginPasswordlessCredentialResponse)(nil), // 85: teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessCredentialResponse + (*LoginRequest_LocalParams)(nil), // 86: teleport.lib.teleterm.v1.LoginRequest.LocalParams + (*LoginRequest_SsoParams)(nil), // 87: teleport.lib.teleterm.v1.LoginRequest.SsoParams + (*AccessRequest)(nil), // 88: teleport.lib.teleterm.v1.AccessRequest + (*ResourceID)(nil), // 89: teleport.lib.teleterm.v1.ResourceID + (*timestamppb.Timestamp)(nil), // 90: google.protobuf.Timestamp + (*v1.AccessList)(nil), // 91: teleport.accesslist.v1.AccessList + (*KubeResource)(nil), // 92: teleport.lib.teleterm.v1.KubeResource + (*Cluster)(nil), // 93: teleport.lib.teleterm.v1.Cluster + (*DatabaseServer)(nil), // 94: teleport.lib.teleterm.v1.DatabaseServer + (*Gateway)(nil), // 95: teleport.lib.teleterm.v1.Gateway + (*Server)(nil), // 96: teleport.lib.teleterm.v1.Server + (*Database)(nil), // 97: teleport.lib.teleterm.v1.Database + (*Kube)(nil), // 98: teleport.lib.teleterm.v1.Kube + (*App)(nil), // 99: teleport.lib.teleterm.v1.App + (*WindowsDesktop)(nil), // 100: teleport.lib.teleterm.v1.WindowsDesktop + (*v11.ClusterUserPreferences)(nil), // 101: teleport.userpreferences.v1.ClusterUserPreferences + (*v11.UnifiedResourcePreferences)(nil), // 102: teleport.userpreferences.v1.UnifiedResourcePreferences + (*v12.DeviceWebToken)(nil), // 103: teleport.devicetrust.v1.DeviceWebToken + (*v12.DeviceConfirmationToken)(nil), // 104: teleport.devicetrust.v1.DeviceConfirmationToken + (*ReportUsageEventRequest)(nil), // 105: teleport.lib.teleterm.v1.ReportUsageEventRequest + (*AuthSettings)(nil), // 106: teleport.lib.teleterm.v1.AuthSettings } var file_teleport_lib_teleterm_v1_service_proto_depIdxs = []int32{ - 85, // 0: teleport.lib.teleterm.v1.GetAccessRequestResponse.request:type_name -> teleport.lib.teleterm.v1.AccessRequest - 85, // 1: teleport.lib.teleterm.v1.GetAccessRequestsResponse.requests:type_name -> teleport.lib.teleterm.v1.AccessRequest - 86, // 2: teleport.lib.teleterm.v1.CreateAccessRequestRequest.resource_ids:type_name -> teleport.lib.teleterm.v1.ResourceID - 87, // 3: teleport.lib.teleterm.v1.CreateAccessRequestRequest.assume_start_time:type_name -> google.protobuf.Timestamp - 87, // 4: teleport.lib.teleterm.v1.CreateAccessRequestRequest.max_duration:type_name -> google.protobuf.Timestamp - 87, // 5: teleport.lib.teleterm.v1.CreateAccessRequestRequest.request_ttl:type_name -> google.protobuf.Timestamp - 85, // 6: teleport.lib.teleterm.v1.CreateAccessRequestResponse.request:type_name -> teleport.lib.teleterm.v1.AccessRequest - 86, // 7: teleport.lib.teleterm.v1.GetRequestableRolesRequest.resource_ids:type_name -> teleport.lib.teleterm.v1.ResourceID - 87, // 8: teleport.lib.teleterm.v1.ReviewAccessRequestRequest.assume_start_time:type_name -> google.protobuf.Timestamp - 85, // 9: teleport.lib.teleterm.v1.ReviewAccessRequestResponse.request:type_name -> teleport.lib.teleterm.v1.AccessRequest - 85, // 10: teleport.lib.teleterm.v1.PromoteAccessRequestResponse.request:type_name -> teleport.lib.teleterm.v1.AccessRequest - 88, // 11: teleport.lib.teleterm.v1.GetSuggestedAccessListsResponse.access_lists:type_name -> teleport.accesslist.v1.AccessList - 89, // 12: teleport.lib.teleterm.v1.ListKubernetesResourcesResponse.resources:type_name -> teleport.lib.teleterm.v1.KubeResource + 88, // 0: teleport.lib.teleterm.v1.GetAccessRequestResponse.request:type_name -> teleport.lib.teleterm.v1.AccessRequest + 88, // 1: teleport.lib.teleterm.v1.GetAccessRequestsResponse.requests:type_name -> teleport.lib.teleterm.v1.AccessRequest + 89, // 2: teleport.lib.teleterm.v1.CreateAccessRequestRequest.resource_ids:type_name -> teleport.lib.teleterm.v1.ResourceID + 90, // 3: teleport.lib.teleterm.v1.CreateAccessRequestRequest.assume_start_time:type_name -> google.protobuf.Timestamp + 90, // 4: teleport.lib.teleterm.v1.CreateAccessRequestRequest.max_duration:type_name -> google.protobuf.Timestamp + 90, // 5: teleport.lib.teleterm.v1.CreateAccessRequestRequest.request_ttl:type_name -> google.protobuf.Timestamp + 88, // 6: teleport.lib.teleterm.v1.CreateAccessRequestResponse.request:type_name -> teleport.lib.teleterm.v1.AccessRequest + 89, // 7: teleport.lib.teleterm.v1.GetRequestableRolesRequest.resource_ids:type_name -> teleport.lib.teleterm.v1.ResourceID + 90, // 8: teleport.lib.teleterm.v1.ReviewAccessRequestRequest.assume_start_time:type_name -> google.protobuf.Timestamp + 88, // 9: teleport.lib.teleterm.v1.ReviewAccessRequestResponse.request:type_name -> teleport.lib.teleterm.v1.AccessRequest + 88, // 10: teleport.lib.teleterm.v1.PromoteAccessRequestResponse.request:type_name -> teleport.lib.teleterm.v1.AccessRequest + 91, // 11: teleport.lib.teleterm.v1.GetSuggestedAccessListsResponse.access_lists:type_name -> teleport.accesslist.v1.AccessList + 92, // 12: teleport.lib.teleterm.v1.ListKubernetesResourcesResponse.resources:type_name -> teleport.lib.teleterm.v1.KubeResource 0, // 13: teleport.lib.teleterm.v1.LoginPasswordlessResponse.prompt:type_name -> teleport.lib.teleterm.v1.PasswordlessPrompt 27, // 14: teleport.lib.teleterm.v1.LoginPasswordlessResponse.credentials:type_name -> teleport.lib.teleterm.v1.CredentialInfo - 80, // 15: teleport.lib.teleterm.v1.LoginPasswordlessRequest.init:type_name -> teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessRequestInit - 81, // 16: teleport.lib.teleterm.v1.LoginPasswordlessRequest.pin:type_name -> teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessPINResponse - 82, // 17: teleport.lib.teleterm.v1.LoginPasswordlessRequest.credential:type_name -> teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessCredentialResponse + 83, // 15: teleport.lib.teleterm.v1.LoginPasswordlessRequest.init:type_name -> teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessRequestInit + 84, // 16: teleport.lib.teleterm.v1.LoginPasswordlessRequest.pin:type_name -> teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessPINResponse + 85, // 17: teleport.lib.teleterm.v1.LoginPasswordlessRequest.credential:type_name -> teleport.lib.teleterm.v1.LoginPasswordlessRequest.LoginPasswordlessCredentialResponse 1, // 18: teleport.lib.teleterm.v1.FileTransferRequest.direction:type_name -> teleport.lib.teleterm.v1.FileTransferDirection - 83, // 19: teleport.lib.teleterm.v1.LoginRequest.local:type_name -> teleport.lib.teleterm.v1.LoginRequest.LocalParams - 84, // 20: teleport.lib.teleterm.v1.LoginRequest.sso:type_name -> teleport.lib.teleterm.v1.LoginRequest.SsoParams - 90, // 21: teleport.lib.teleterm.v1.ListClustersResponse.clusters:type_name -> teleport.lib.teleterm.v1.Cluster - 91, // 22: teleport.lib.teleterm.v1.ListGatewaysResponse.gateways:type_name -> teleport.lib.teleterm.v1.Gateway - 92, // 23: teleport.lib.teleterm.v1.GetServersResponse.agents:type_name -> teleport.lib.teleterm.v1.Server - 2, // 24: teleport.lib.teleterm.v1.UpdateHeadlessAuthenticationStateRequest.state:type_name -> teleport.lib.teleterm.v1.HeadlessAuthenticationState - 92, // 25: teleport.lib.teleterm.v1.WaitForConnectMyComputerNodeJoinResponse.server:type_name -> teleport.lib.teleterm.v1.Server - 63, // 26: teleport.lib.teleterm.v1.ListUnifiedResourcesRequest.sort_by:type_name -> teleport.lib.teleterm.v1.SortBy - 65, // 27: teleport.lib.teleterm.v1.ListUnifiedResourcesResponse.resources:type_name -> teleport.lib.teleterm.v1.PaginatedResource - 93, // 28: teleport.lib.teleterm.v1.PaginatedResource.database:type_name -> teleport.lib.teleterm.v1.Database - 92, // 29: teleport.lib.teleterm.v1.PaginatedResource.server:type_name -> teleport.lib.teleterm.v1.Server - 94, // 30: teleport.lib.teleterm.v1.PaginatedResource.kube:type_name -> teleport.lib.teleterm.v1.Kube - 95, // 31: teleport.lib.teleterm.v1.PaginatedResource.app:type_name -> teleport.lib.teleterm.v1.App - 96, // 32: teleport.lib.teleterm.v1.PaginatedResource.windows_desktop:type_name -> teleport.lib.teleterm.v1.WindowsDesktop - 70, // 33: teleport.lib.teleterm.v1.GetUserPreferencesResponse.user_preferences:type_name -> teleport.lib.teleterm.v1.UserPreferences - 70, // 34: teleport.lib.teleterm.v1.UpdateUserPreferencesRequest.user_preferences:type_name -> teleport.lib.teleterm.v1.UserPreferences - 70, // 35: teleport.lib.teleterm.v1.UpdateUserPreferencesResponse.user_preferences:type_name -> teleport.lib.teleterm.v1.UserPreferences - 97, // 36: teleport.lib.teleterm.v1.UserPreferences.cluster_preferences:type_name -> teleport.userpreferences.v1.ClusterUserPreferences - 98, // 37: teleport.lib.teleterm.v1.UserPreferences.unified_resource_preferences:type_name -> teleport.userpreferences.v1.UnifiedResourcePreferences - 99, // 38: teleport.lib.teleterm.v1.AuthenticateWebDeviceRequest.device_web_token:type_name -> teleport.devicetrust.v1.DeviceWebToken - 100, // 39: teleport.lib.teleterm.v1.AuthenticateWebDeviceResponse.confirmation_token:type_name -> teleport.devicetrust.v1.DeviceConfirmationToken - 95, // 40: teleport.lib.teleterm.v1.GetAppResponse.app:type_name -> teleport.lib.teleterm.v1.App - 75, // 41: teleport.lib.teleterm.v1.ConnectToDesktopRequest.target_desktop:type_name -> teleport.lib.teleterm.v1.TargetDesktop - 48, // 42: teleport.lib.teleterm.v1.TerminalService.UpdateTshdEventsServerAddress:input_type -> teleport.lib.teleterm.v1.UpdateTshdEventsServerAddressRequest - 34, // 43: teleport.lib.teleterm.v1.TerminalService.ListRootClusters:input_type -> teleport.lib.teleterm.v1.ListClustersRequest - 36, // 44: teleport.lib.teleterm.v1.TerminalService.ListLeafClusters:input_type -> teleport.lib.teleterm.v1.ListLeafClustersRequest - 7, // 45: teleport.lib.teleterm.v1.TerminalService.StartHeadlessWatcher:input_type -> teleport.lib.teleterm.v1.StartHeadlessWatcherRequest - 37, // 46: teleport.lib.teleterm.v1.TerminalService.ListDatabaseUsers:input_type -> teleport.lib.teleterm.v1.ListDatabaseUsersRequest - 45, // 47: teleport.lib.teleterm.v1.TerminalService.GetServers:input_type -> teleport.lib.teleterm.v1.GetServersRequest - 10, // 48: teleport.lib.teleterm.v1.TerminalService.GetAccessRequests:input_type -> teleport.lib.teleterm.v1.GetAccessRequestsRequest - 9, // 49: teleport.lib.teleterm.v1.TerminalService.GetAccessRequest:input_type -> teleport.lib.teleterm.v1.GetAccessRequestRequest - 13, // 50: teleport.lib.teleterm.v1.TerminalService.DeleteAccessRequest:input_type -> teleport.lib.teleterm.v1.DeleteAccessRequestRequest - 14, // 51: teleport.lib.teleterm.v1.TerminalService.CreateAccessRequest:input_type -> teleport.lib.teleterm.v1.CreateAccessRequestRequest - 19, // 52: teleport.lib.teleterm.v1.TerminalService.ReviewAccessRequest:input_type -> teleport.lib.teleterm.v1.ReviewAccessRequestRequest - 17, // 53: teleport.lib.teleterm.v1.TerminalService.GetRequestableRoles:input_type -> teleport.lib.teleterm.v1.GetRequestableRolesRequest - 16, // 54: teleport.lib.teleterm.v1.TerminalService.AssumeRole:input_type -> teleport.lib.teleterm.v1.AssumeRoleRequest - 21, // 55: teleport.lib.teleterm.v1.TerminalService.PromoteAccessRequest:input_type -> teleport.lib.teleterm.v1.PromoteAccessRequestRequest - 23, // 56: teleport.lib.teleterm.v1.TerminalService.GetSuggestedAccessLists:input_type -> teleport.lib.teleterm.v1.GetSuggestedAccessListsRequest - 25, // 57: teleport.lib.teleterm.v1.TerminalService.ListKubernetesResources:input_type -> teleport.lib.teleterm.v1.ListKubernetesResourcesRequest - 33, // 58: teleport.lib.teleterm.v1.TerminalService.AddCluster:input_type -> teleport.lib.teleterm.v1.AddClusterRequest - 4, // 59: teleport.lib.teleterm.v1.TerminalService.RemoveCluster:input_type -> teleport.lib.teleterm.v1.RemoveClusterRequest - 40, // 60: teleport.lib.teleterm.v1.TerminalService.ListGateways:input_type -> teleport.lib.teleterm.v1.ListGatewaysRequest - 39, // 61: teleport.lib.teleterm.v1.TerminalService.CreateGateway:input_type -> teleport.lib.teleterm.v1.CreateGatewayRequest - 42, // 62: teleport.lib.teleterm.v1.TerminalService.RemoveGateway:input_type -> teleport.lib.teleterm.v1.RemoveGatewayRequest - 43, // 63: teleport.lib.teleterm.v1.TerminalService.SetGatewayTargetSubresourceName:input_type -> teleport.lib.teleterm.v1.SetGatewayTargetSubresourceNameRequest - 44, // 64: teleport.lib.teleterm.v1.TerminalService.SetGatewayLocalPort:input_type -> teleport.lib.teleterm.v1.SetGatewayLocalPortRequest - 47, // 65: teleport.lib.teleterm.v1.TerminalService.GetAuthSettings:input_type -> teleport.lib.teleterm.v1.GetAuthSettingsRequest - 5, // 66: teleport.lib.teleterm.v1.TerminalService.GetCluster:input_type -> teleport.lib.teleterm.v1.GetClusterRequest - 32, // 67: teleport.lib.teleterm.v1.TerminalService.Login:input_type -> teleport.lib.teleterm.v1.LoginRequest - 29, // 68: teleport.lib.teleterm.v1.TerminalService.LoginPasswordless:input_type -> teleport.lib.teleterm.v1.LoginPasswordlessRequest - 6, // 69: teleport.lib.teleterm.v1.TerminalService.Logout:input_type -> teleport.lib.teleterm.v1.LogoutRequest - 30, // 70: teleport.lib.teleterm.v1.TerminalService.TransferFile:input_type -> teleport.lib.teleterm.v1.FileTransferRequest - 101, // 71: teleport.lib.teleterm.v1.TerminalService.ReportUsageEvent:input_type -> teleport.lib.teleterm.v1.ReportUsageEventRequest - 50, // 72: teleport.lib.teleterm.v1.TerminalService.UpdateHeadlessAuthenticationState:input_type -> teleport.lib.teleterm.v1.UpdateHeadlessAuthenticationStateRequest - 52, // 73: teleport.lib.teleterm.v1.TerminalService.CreateConnectMyComputerRole:input_type -> teleport.lib.teleterm.v1.CreateConnectMyComputerRoleRequest - 54, // 74: teleport.lib.teleterm.v1.TerminalService.CreateConnectMyComputerNodeToken:input_type -> teleport.lib.teleterm.v1.CreateConnectMyComputerNodeTokenRequest - 56, // 75: teleport.lib.teleterm.v1.TerminalService.WaitForConnectMyComputerNodeJoin:input_type -> teleport.lib.teleterm.v1.WaitForConnectMyComputerNodeJoinRequest - 58, // 76: teleport.lib.teleterm.v1.TerminalService.DeleteConnectMyComputerNode:input_type -> teleport.lib.teleterm.v1.DeleteConnectMyComputerNodeRequest - 60, // 77: teleport.lib.teleterm.v1.TerminalService.GetConnectMyComputerNodeName:input_type -> teleport.lib.teleterm.v1.GetConnectMyComputerNodeNameRequest - 62, // 78: teleport.lib.teleterm.v1.TerminalService.ListUnifiedResources:input_type -> teleport.lib.teleterm.v1.ListUnifiedResourcesRequest - 66, // 79: teleport.lib.teleterm.v1.TerminalService.GetUserPreferences:input_type -> teleport.lib.teleterm.v1.GetUserPreferencesRequest - 68, // 80: teleport.lib.teleterm.v1.TerminalService.UpdateUserPreferences:input_type -> teleport.lib.teleterm.v1.UpdateUserPreferencesRequest - 71, // 81: teleport.lib.teleterm.v1.TerminalService.AuthenticateWebDevice:input_type -> teleport.lib.teleterm.v1.AuthenticateWebDeviceRequest - 73, // 82: teleport.lib.teleterm.v1.TerminalService.GetApp:input_type -> teleport.lib.teleterm.v1.GetAppRequest - 76, // 83: teleport.lib.teleterm.v1.TerminalService.ConnectToDesktop:input_type -> teleport.lib.teleterm.v1.ConnectToDesktopRequest - 78, // 84: teleport.lib.teleterm.v1.TerminalService.SetSharedDirectoryForDesktopSession:input_type -> teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionRequest - 49, // 85: teleport.lib.teleterm.v1.TerminalService.UpdateTshdEventsServerAddress:output_type -> teleport.lib.teleterm.v1.UpdateTshdEventsServerAddressResponse - 35, // 86: teleport.lib.teleterm.v1.TerminalService.ListRootClusters:output_type -> teleport.lib.teleterm.v1.ListClustersResponse - 35, // 87: teleport.lib.teleterm.v1.TerminalService.ListLeafClusters:output_type -> teleport.lib.teleterm.v1.ListClustersResponse - 8, // 88: teleport.lib.teleterm.v1.TerminalService.StartHeadlessWatcher:output_type -> teleport.lib.teleterm.v1.StartHeadlessWatcherResponse - 38, // 89: teleport.lib.teleterm.v1.TerminalService.ListDatabaseUsers:output_type -> teleport.lib.teleterm.v1.ListDatabaseUsersResponse - 46, // 90: teleport.lib.teleterm.v1.TerminalService.GetServers:output_type -> teleport.lib.teleterm.v1.GetServersResponse - 12, // 91: teleport.lib.teleterm.v1.TerminalService.GetAccessRequests:output_type -> teleport.lib.teleterm.v1.GetAccessRequestsResponse - 11, // 92: teleport.lib.teleterm.v1.TerminalService.GetAccessRequest:output_type -> teleport.lib.teleterm.v1.GetAccessRequestResponse - 3, // 93: teleport.lib.teleterm.v1.TerminalService.DeleteAccessRequest:output_type -> teleport.lib.teleterm.v1.EmptyResponse - 15, // 94: teleport.lib.teleterm.v1.TerminalService.CreateAccessRequest:output_type -> teleport.lib.teleterm.v1.CreateAccessRequestResponse - 20, // 95: teleport.lib.teleterm.v1.TerminalService.ReviewAccessRequest:output_type -> teleport.lib.teleterm.v1.ReviewAccessRequestResponse - 18, // 96: teleport.lib.teleterm.v1.TerminalService.GetRequestableRoles:output_type -> teleport.lib.teleterm.v1.GetRequestableRolesResponse - 3, // 97: teleport.lib.teleterm.v1.TerminalService.AssumeRole:output_type -> teleport.lib.teleterm.v1.EmptyResponse - 22, // 98: teleport.lib.teleterm.v1.TerminalService.PromoteAccessRequest:output_type -> teleport.lib.teleterm.v1.PromoteAccessRequestResponse - 24, // 99: teleport.lib.teleterm.v1.TerminalService.GetSuggestedAccessLists:output_type -> teleport.lib.teleterm.v1.GetSuggestedAccessListsResponse - 26, // 100: teleport.lib.teleterm.v1.TerminalService.ListKubernetesResources:output_type -> teleport.lib.teleterm.v1.ListKubernetesResourcesResponse - 90, // 101: teleport.lib.teleterm.v1.TerminalService.AddCluster:output_type -> teleport.lib.teleterm.v1.Cluster - 3, // 102: teleport.lib.teleterm.v1.TerminalService.RemoveCluster:output_type -> teleport.lib.teleterm.v1.EmptyResponse - 41, // 103: teleport.lib.teleterm.v1.TerminalService.ListGateways:output_type -> teleport.lib.teleterm.v1.ListGatewaysResponse - 91, // 104: teleport.lib.teleterm.v1.TerminalService.CreateGateway:output_type -> teleport.lib.teleterm.v1.Gateway - 3, // 105: teleport.lib.teleterm.v1.TerminalService.RemoveGateway:output_type -> teleport.lib.teleterm.v1.EmptyResponse - 91, // 106: teleport.lib.teleterm.v1.TerminalService.SetGatewayTargetSubresourceName:output_type -> teleport.lib.teleterm.v1.Gateway - 91, // 107: teleport.lib.teleterm.v1.TerminalService.SetGatewayLocalPort:output_type -> teleport.lib.teleterm.v1.Gateway - 102, // 108: teleport.lib.teleterm.v1.TerminalService.GetAuthSettings:output_type -> teleport.lib.teleterm.v1.AuthSettings - 90, // 109: teleport.lib.teleterm.v1.TerminalService.GetCluster:output_type -> teleport.lib.teleterm.v1.Cluster - 3, // 110: teleport.lib.teleterm.v1.TerminalService.Login:output_type -> teleport.lib.teleterm.v1.EmptyResponse - 28, // 111: teleport.lib.teleterm.v1.TerminalService.LoginPasswordless:output_type -> teleport.lib.teleterm.v1.LoginPasswordlessResponse - 3, // 112: teleport.lib.teleterm.v1.TerminalService.Logout:output_type -> teleport.lib.teleterm.v1.EmptyResponse - 31, // 113: teleport.lib.teleterm.v1.TerminalService.TransferFile:output_type -> teleport.lib.teleterm.v1.FileTransferProgress - 3, // 114: teleport.lib.teleterm.v1.TerminalService.ReportUsageEvent:output_type -> teleport.lib.teleterm.v1.EmptyResponse - 51, // 115: teleport.lib.teleterm.v1.TerminalService.UpdateHeadlessAuthenticationState:output_type -> teleport.lib.teleterm.v1.UpdateHeadlessAuthenticationStateResponse - 53, // 116: teleport.lib.teleterm.v1.TerminalService.CreateConnectMyComputerRole:output_type -> teleport.lib.teleterm.v1.CreateConnectMyComputerRoleResponse - 55, // 117: teleport.lib.teleterm.v1.TerminalService.CreateConnectMyComputerNodeToken:output_type -> teleport.lib.teleterm.v1.CreateConnectMyComputerNodeTokenResponse - 57, // 118: teleport.lib.teleterm.v1.TerminalService.WaitForConnectMyComputerNodeJoin:output_type -> teleport.lib.teleterm.v1.WaitForConnectMyComputerNodeJoinResponse - 59, // 119: teleport.lib.teleterm.v1.TerminalService.DeleteConnectMyComputerNode:output_type -> teleport.lib.teleterm.v1.DeleteConnectMyComputerNodeResponse - 61, // 120: teleport.lib.teleterm.v1.TerminalService.GetConnectMyComputerNodeName:output_type -> teleport.lib.teleterm.v1.GetConnectMyComputerNodeNameResponse - 64, // 121: teleport.lib.teleterm.v1.TerminalService.ListUnifiedResources:output_type -> teleport.lib.teleterm.v1.ListUnifiedResourcesResponse - 67, // 122: teleport.lib.teleterm.v1.TerminalService.GetUserPreferences:output_type -> teleport.lib.teleterm.v1.GetUserPreferencesResponse - 69, // 123: teleport.lib.teleterm.v1.TerminalService.UpdateUserPreferences:output_type -> teleport.lib.teleterm.v1.UpdateUserPreferencesResponse - 72, // 124: teleport.lib.teleterm.v1.TerminalService.AuthenticateWebDevice:output_type -> teleport.lib.teleterm.v1.AuthenticateWebDeviceResponse - 74, // 125: teleport.lib.teleterm.v1.TerminalService.GetApp:output_type -> teleport.lib.teleterm.v1.GetAppResponse - 77, // 126: teleport.lib.teleterm.v1.TerminalService.ConnectToDesktop:output_type -> teleport.lib.teleterm.v1.ConnectToDesktopResponse - 79, // 127: teleport.lib.teleterm.v1.TerminalService.SetSharedDirectoryForDesktopSession:output_type -> teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionResponse - 85, // [85:128] is the sub-list for method output_type - 42, // [42:85] is the sub-list for method input_type - 42, // [42:42] is the sub-list for extension type_name - 42, // [42:42] is the sub-list for extension extendee - 0, // [0:42] is the sub-list for field type_name + 86, // 19: teleport.lib.teleterm.v1.LoginRequest.local:type_name -> teleport.lib.teleterm.v1.LoginRequest.LocalParams + 87, // 20: teleport.lib.teleterm.v1.LoginRequest.sso:type_name -> teleport.lib.teleterm.v1.LoginRequest.SsoParams + 93, // 21: teleport.lib.teleterm.v1.ListClustersResponse.clusters:type_name -> teleport.lib.teleterm.v1.Cluster + 39, // 22: teleport.lib.teleterm.v1.ListDatabaseServersRequest.params:type_name -> teleport.lib.teleterm.v1.ListResourcesParams + 94, // 23: teleport.lib.teleterm.v1.ListDatabaseServersResponse.resources:type_name -> teleport.lib.teleterm.v1.DatabaseServer + 95, // 24: teleport.lib.teleterm.v1.ListGatewaysResponse.gateways:type_name -> teleport.lib.teleterm.v1.Gateway + 96, // 25: teleport.lib.teleterm.v1.GetServersResponse.agents:type_name -> teleport.lib.teleterm.v1.Server + 2, // 26: teleport.lib.teleterm.v1.UpdateHeadlessAuthenticationStateRequest.state:type_name -> teleport.lib.teleterm.v1.HeadlessAuthenticationState + 96, // 27: teleport.lib.teleterm.v1.WaitForConnectMyComputerNodeJoinResponse.server:type_name -> teleport.lib.teleterm.v1.Server + 66, // 28: teleport.lib.teleterm.v1.ListUnifiedResourcesRequest.sort_by:type_name -> teleport.lib.teleterm.v1.SortBy + 68, // 29: teleport.lib.teleterm.v1.ListUnifiedResourcesResponse.resources:type_name -> teleport.lib.teleterm.v1.PaginatedResource + 97, // 30: teleport.lib.teleterm.v1.PaginatedResource.database:type_name -> teleport.lib.teleterm.v1.Database + 96, // 31: teleport.lib.teleterm.v1.PaginatedResource.server:type_name -> teleport.lib.teleterm.v1.Server + 98, // 32: teleport.lib.teleterm.v1.PaginatedResource.kube:type_name -> teleport.lib.teleterm.v1.Kube + 99, // 33: teleport.lib.teleterm.v1.PaginatedResource.app:type_name -> teleport.lib.teleterm.v1.App + 100, // 34: teleport.lib.teleterm.v1.PaginatedResource.windows_desktop:type_name -> teleport.lib.teleterm.v1.WindowsDesktop + 73, // 35: teleport.lib.teleterm.v1.GetUserPreferencesResponse.user_preferences:type_name -> teleport.lib.teleterm.v1.UserPreferences + 73, // 36: teleport.lib.teleterm.v1.UpdateUserPreferencesRequest.user_preferences:type_name -> teleport.lib.teleterm.v1.UserPreferences + 73, // 37: teleport.lib.teleterm.v1.UpdateUserPreferencesResponse.user_preferences:type_name -> teleport.lib.teleterm.v1.UserPreferences + 101, // 38: teleport.lib.teleterm.v1.UserPreferences.cluster_preferences:type_name -> teleport.userpreferences.v1.ClusterUserPreferences + 102, // 39: teleport.lib.teleterm.v1.UserPreferences.unified_resource_preferences:type_name -> teleport.userpreferences.v1.UnifiedResourcePreferences + 103, // 40: teleport.lib.teleterm.v1.AuthenticateWebDeviceRequest.device_web_token:type_name -> teleport.devicetrust.v1.DeviceWebToken + 104, // 41: teleport.lib.teleterm.v1.AuthenticateWebDeviceResponse.confirmation_token:type_name -> teleport.devicetrust.v1.DeviceConfirmationToken + 99, // 42: teleport.lib.teleterm.v1.GetAppResponse.app:type_name -> teleport.lib.teleterm.v1.App + 78, // 43: teleport.lib.teleterm.v1.ConnectToDesktopRequest.target_desktop:type_name -> teleport.lib.teleterm.v1.TargetDesktop + 51, // 44: teleport.lib.teleterm.v1.TerminalService.UpdateTshdEventsServerAddress:input_type -> teleport.lib.teleterm.v1.UpdateTshdEventsServerAddressRequest + 34, // 45: teleport.lib.teleterm.v1.TerminalService.ListRootClusters:input_type -> teleport.lib.teleterm.v1.ListClustersRequest + 36, // 46: teleport.lib.teleterm.v1.TerminalService.ListLeafClusters:input_type -> teleport.lib.teleterm.v1.ListLeafClustersRequest + 7, // 47: teleport.lib.teleterm.v1.TerminalService.StartHeadlessWatcher:input_type -> teleport.lib.teleterm.v1.StartHeadlessWatcherRequest + 37, // 48: teleport.lib.teleterm.v1.TerminalService.ListDatabaseUsers:input_type -> teleport.lib.teleterm.v1.ListDatabaseUsersRequest + 40, // 49: teleport.lib.teleterm.v1.TerminalService.ListDatabaseServers:input_type -> teleport.lib.teleterm.v1.ListDatabaseServersRequest + 48, // 50: teleport.lib.teleterm.v1.TerminalService.GetServers:input_type -> teleport.lib.teleterm.v1.GetServersRequest + 10, // 51: teleport.lib.teleterm.v1.TerminalService.GetAccessRequests:input_type -> teleport.lib.teleterm.v1.GetAccessRequestsRequest + 9, // 52: teleport.lib.teleterm.v1.TerminalService.GetAccessRequest:input_type -> teleport.lib.teleterm.v1.GetAccessRequestRequest + 13, // 53: teleport.lib.teleterm.v1.TerminalService.DeleteAccessRequest:input_type -> teleport.lib.teleterm.v1.DeleteAccessRequestRequest + 14, // 54: teleport.lib.teleterm.v1.TerminalService.CreateAccessRequest:input_type -> teleport.lib.teleterm.v1.CreateAccessRequestRequest + 19, // 55: teleport.lib.teleterm.v1.TerminalService.ReviewAccessRequest:input_type -> teleport.lib.teleterm.v1.ReviewAccessRequestRequest + 17, // 56: teleport.lib.teleterm.v1.TerminalService.GetRequestableRoles:input_type -> teleport.lib.teleterm.v1.GetRequestableRolesRequest + 16, // 57: teleport.lib.teleterm.v1.TerminalService.AssumeRole:input_type -> teleport.lib.teleterm.v1.AssumeRoleRequest + 21, // 58: teleport.lib.teleterm.v1.TerminalService.PromoteAccessRequest:input_type -> teleport.lib.teleterm.v1.PromoteAccessRequestRequest + 23, // 59: teleport.lib.teleterm.v1.TerminalService.GetSuggestedAccessLists:input_type -> teleport.lib.teleterm.v1.GetSuggestedAccessListsRequest + 25, // 60: teleport.lib.teleterm.v1.TerminalService.ListKubernetesResources:input_type -> teleport.lib.teleterm.v1.ListKubernetesResourcesRequest + 33, // 61: teleport.lib.teleterm.v1.TerminalService.AddCluster:input_type -> teleport.lib.teleterm.v1.AddClusterRequest + 4, // 62: teleport.lib.teleterm.v1.TerminalService.RemoveCluster:input_type -> teleport.lib.teleterm.v1.RemoveClusterRequest + 43, // 63: teleport.lib.teleterm.v1.TerminalService.ListGateways:input_type -> teleport.lib.teleterm.v1.ListGatewaysRequest + 42, // 64: teleport.lib.teleterm.v1.TerminalService.CreateGateway:input_type -> teleport.lib.teleterm.v1.CreateGatewayRequest + 45, // 65: teleport.lib.teleterm.v1.TerminalService.RemoveGateway:input_type -> teleport.lib.teleterm.v1.RemoveGatewayRequest + 46, // 66: teleport.lib.teleterm.v1.TerminalService.SetGatewayTargetSubresourceName:input_type -> teleport.lib.teleterm.v1.SetGatewayTargetSubresourceNameRequest + 47, // 67: teleport.lib.teleterm.v1.TerminalService.SetGatewayLocalPort:input_type -> teleport.lib.teleterm.v1.SetGatewayLocalPortRequest + 50, // 68: teleport.lib.teleterm.v1.TerminalService.GetAuthSettings:input_type -> teleport.lib.teleterm.v1.GetAuthSettingsRequest + 5, // 69: teleport.lib.teleterm.v1.TerminalService.GetCluster:input_type -> teleport.lib.teleterm.v1.GetClusterRequest + 32, // 70: teleport.lib.teleterm.v1.TerminalService.Login:input_type -> teleport.lib.teleterm.v1.LoginRequest + 29, // 71: teleport.lib.teleterm.v1.TerminalService.LoginPasswordless:input_type -> teleport.lib.teleterm.v1.LoginPasswordlessRequest + 6, // 72: teleport.lib.teleterm.v1.TerminalService.Logout:input_type -> teleport.lib.teleterm.v1.LogoutRequest + 30, // 73: teleport.lib.teleterm.v1.TerminalService.TransferFile:input_type -> teleport.lib.teleterm.v1.FileTransferRequest + 105, // 74: teleport.lib.teleterm.v1.TerminalService.ReportUsageEvent:input_type -> teleport.lib.teleterm.v1.ReportUsageEventRequest + 53, // 75: teleport.lib.teleterm.v1.TerminalService.UpdateHeadlessAuthenticationState:input_type -> teleport.lib.teleterm.v1.UpdateHeadlessAuthenticationStateRequest + 55, // 76: teleport.lib.teleterm.v1.TerminalService.CreateConnectMyComputerRole:input_type -> teleport.lib.teleterm.v1.CreateConnectMyComputerRoleRequest + 57, // 77: teleport.lib.teleterm.v1.TerminalService.CreateConnectMyComputerNodeToken:input_type -> teleport.lib.teleterm.v1.CreateConnectMyComputerNodeTokenRequest + 59, // 78: teleport.lib.teleterm.v1.TerminalService.WaitForConnectMyComputerNodeJoin:input_type -> teleport.lib.teleterm.v1.WaitForConnectMyComputerNodeJoinRequest + 61, // 79: teleport.lib.teleterm.v1.TerminalService.DeleteConnectMyComputerNode:input_type -> teleport.lib.teleterm.v1.DeleteConnectMyComputerNodeRequest + 63, // 80: teleport.lib.teleterm.v1.TerminalService.GetConnectMyComputerNodeName:input_type -> teleport.lib.teleterm.v1.GetConnectMyComputerNodeNameRequest + 65, // 81: teleport.lib.teleterm.v1.TerminalService.ListUnifiedResources:input_type -> teleport.lib.teleterm.v1.ListUnifiedResourcesRequest + 69, // 82: teleport.lib.teleterm.v1.TerminalService.GetUserPreferences:input_type -> teleport.lib.teleterm.v1.GetUserPreferencesRequest + 71, // 83: teleport.lib.teleterm.v1.TerminalService.UpdateUserPreferences:input_type -> teleport.lib.teleterm.v1.UpdateUserPreferencesRequest + 74, // 84: teleport.lib.teleterm.v1.TerminalService.AuthenticateWebDevice:input_type -> teleport.lib.teleterm.v1.AuthenticateWebDeviceRequest + 76, // 85: teleport.lib.teleterm.v1.TerminalService.GetApp:input_type -> teleport.lib.teleterm.v1.GetAppRequest + 79, // 86: teleport.lib.teleterm.v1.TerminalService.ConnectToDesktop:input_type -> teleport.lib.teleterm.v1.ConnectToDesktopRequest + 81, // 87: teleport.lib.teleterm.v1.TerminalService.SetSharedDirectoryForDesktopSession:input_type -> teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionRequest + 52, // 88: teleport.lib.teleterm.v1.TerminalService.UpdateTshdEventsServerAddress:output_type -> teleport.lib.teleterm.v1.UpdateTshdEventsServerAddressResponse + 35, // 89: teleport.lib.teleterm.v1.TerminalService.ListRootClusters:output_type -> teleport.lib.teleterm.v1.ListClustersResponse + 35, // 90: teleport.lib.teleterm.v1.TerminalService.ListLeafClusters:output_type -> teleport.lib.teleterm.v1.ListClustersResponse + 8, // 91: teleport.lib.teleterm.v1.TerminalService.StartHeadlessWatcher:output_type -> teleport.lib.teleterm.v1.StartHeadlessWatcherResponse + 38, // 92: teleport.lib.teleterm.v1.TerminalService.ListDatabaseUsers:output_type -> teleport.lib.teleterm.v1.ListDatabaseUsersResponse + 41, // 93: teleport.lib.teleterm.v1.TerminalService.ListDatabaseServers:output_type -> teleport.lib.teleterm.v1.ListDatabaseServersResponse + 49, // 94: teleport.lib.teleterm.v1.TerminalService.GetServers:output_type -> teleport.lib.teleterm.v1.GetServersResponse + 12, // 95: teleport.lib.teleterm.v1.TerminalService.GetAccessRequests:output_type -> teleport.lib.teleterm.v1.GetAccessRequestsResponse + 11, // 96: teleport.lib.teleterm.v1.TerminalService.GetAccessRequest:output_type -> teleport.lib.teleterm.v1.GetAccessRequestResponse + 3, // 97: teleport.lib.teleterm.v1.TerminalService.DeleteAccessRequest:output_type -> teleport.lib.teleterm.v1.EmptyResponse + 15, // 98: teleport.lib.teleterm.v1.TerminalService.CreateAccessRequest:output_type -> teleport.lib.teleterm.v1.CreateAccessRequestResponse + 20, // 99: teleport.lib.teleterm.v1.TerminalService.ReviewAccessRequest:output_type -> teleport.lib.teleterm.v1.ReviewAccessRequestResponse + 18, // 100: teleport.lib.teleterm.v1.TerminalService.GetRequestableRoles:output_type -> teleport.lib.teleterm.v1.GetRequestableRolesResponse + 3, // 101: teleport.lib.teleterm.v1.TerminalService.AssumeRole:output_type -> teleport.lib.teleterm.v1.EmptyResponse + 22, // 102: teleport.lib.teleterm.v1.TerminalService.PromoteAccessRequest:output_type -> teleport.lib.teleterm.v1.PromoteAccessRequestResponse + 24, // 103: teleport.lib.teleterm.v1.TerminalService.GetSuggestedAccessLists:output_type -> teleport.lib.teleterm.v1.GetSuggestedAccessListsResponse + 26, // 104: teleport.lib.teleterm.v1.TerminalService.ListKubernetesResources:output_type -> teleport.lib.teleterm.v1.ListKubernetesResourcesResponse + 93, // 105: teleport.lib.teleterm.v1.TerminalService.AddCluster:output_type -> teleport.lib.teleterm.v1.Cluster + 3, // 106: teleport.lib.teleterm.v1.TerminalService.RemoveCluster:output_type -> teleport.lib.teleterm.v1.EmptyResponse + 44, // 107: teleport.lib.teleterm.v1.TerminalService.ListGateways:output_type -> teleport.lib.teleterm.v1.ListGatewaysResponse + 95, // 108: teleport.lib.teleterm.v1.TerminalService.CreateGateway:output_type -> teleport.lib.teleterm.v1.Gateway + 3, // 109: teleport.lib.teleterm.v1.TerminalService.RemoveGateway:output_type -> teleport.lib.teleterm.v1.EmptyResponse + 95, // 110: teleport.lib.teleterm.v1.TerminalService.SetGatewayTargetSubresourceName:output_type -> teleport.lib.teleterm.v1.Gateway + 95, // 111: teleport.lib.teleterm.v1.TerminalService.SetGatewayLocalPort:output_type -> teleport.lib.teleterm.v1.Gateway + 106, // 112: teleport.lib.teleterm.v1.TerminalService.GetAuthSettings:output_type -> teleport.lib.teleterm.v1.AuthSettings + 93, // 113: teleport.lib.teleterm.v1.TerminalService.GetCluster:output_type -> teleport.lib.teleterm.v1.Cluster + 3, // 114: teleport.lib.teleterm.v1.TerminalService.Login:output_type -> teleport.lib.teleterm.v1.EmptyResponse + 28, // 115: teleport.lib.teleterm.v1.TerminalService.LoginPasswordless:output_type -> teleport.lib.teleterm.v1.LoginPasswordlessResponse + 3, // 116: teleport.lib.teleterm.v1.TerminalService.Logout:output_type -> teleport.lib.teleterm.v1.EmptyResponse + 31, // 117: teleport.lib.teleterm.v1.TerminalService.TransferFile:output_type -> teleport.lib.teleterm.v1.FileTransferProgress + 3, // 118: teleport.lib.teleterm.v1.TerminalService.ReportUsageEvent:output_type -> teleport.lib.teleterm.v1.EmptyResponse + 54, // 119: teleport.lib.teleterm.v1.TerminalService.UpdateHeadlessAuthenticationState:output_type -> teleport.lib.teleterm.v1.UpdateHeadlessAuthenticationStateResponse + 56, // 120: teleport.lib.teleterm.v1.TerminalService.CreateConnectMyComputerRole:output_type -> teleport.lib.teleterm.v1.CreateConnectMyComputerRoleResponse + 58, // 121: teleport.lib.teleterm.v1.TerminalService.CreateConnectMyComputerNodeToken:output_type -> teleport.lib.teleterm.v1.CreateConnectMyComputerNodeTokenResponse + 60, // 122: teleport.lib.teleterm.v1.TerminalService.WaitForConnectMyComputerNodeJoin:output_type -> teleport.lib.teleterm.v1.WaitForConnectMyComputerNodeJoinResponse + 62, // 123: teleport.lib.teleterm.v1.TerminalService.DeleteConnectMyComputerNode:output_type -> teleport.lib.teleterm.v1.DeleteConnectMyComputerNodeResponse + 64, // 124: teleport.lib.teleterm.v1.TerminalService.GetConnectMyComputerNodeName:output_type -> teleport.lib.teleterm.v1.GetConnectMyComputerNodeNameResponse + 67, // 125: teleport.lib.teleterm.v1.TerminalService.ListUnifiedResources:output_type -> teleport.lib.teleterm.v1.ListUnifiedResourcesResponse + 70, // 126: teleport.lib.teleterm.v1.TerminalService.GetUserPreferences:output_type -> teleport.lib.teleterm.v1.GetUserPreferencesResponse + 72, // 127: teleport.lib.teleterm.v1.TerminalService.UpdateUserPreferences:output_type -> teleport.lib.teleterm.v1.UpdateUserPreferencesResponse + 75, // 128: teleport.lib.teleterm.v1.TerminalService.AuthenticateWebDevice:output_type -> teleport.lib.teleterm.v1.AuthenticateWebDeviceResponse + 77, // 129: teleport.lib.teleterm.v1.TerminalService.GetApp:output_type -> teleport.lib.teleterm.v1.GetAppResponse + 80, // 130: teleport.lib.teleterm.v1.TerminalService.ConnectToDesktop:output_type -> teleport.lib.teleterm.v1.ConnectToDesktopResponse + 82, // 131: teleport.lib.teleterm.v1.TerminalService.SetSharedDirectoryForDesktopSession:output_type -> teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionResponse + 88, // [88:132] is the sub-list for method output_type + 44, // [44:88] is the sub-list for method input_type + 44, // [44:44] is the sub-list for extension type_name + 44, // [44:44] is the sub-list for extension extendee + 0, // [0:44] is the sub-list for field type_name } func init() { file_teleport_lib_teleterm_v1_service_proto_init() } @@ -5233,7 +5431,7 @@ func file_teleport_lib_teleterm_v1_service_proto_init() { (*LoginRequest_Local)(nil), (*LoginRequest_Sso)(nil), } - file_teleport_lib_teleterm_v1_service_proto_msgTypes[62].OneofWrappers = []any{ + file_teleport_lib_teleterm_v1_service_proto_msgTypes[65].OneofWrappers = []any{ (*PaginatedResource_Database)(nil), (*PaginatedResource_Server)(nil), (*PaginatedResource_Kube)(nil), @@ -5246,7 +5444,7 @@ func file_teleport_lib_teleterm_v1_service_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_teleport_lib_teleterm_v1_service_proto_rawDesc), len(file_teleport_lib_teleterm_v1_service_proto_rawDesc)), NumEnums: 3, - NumMessages: 82, + NumMessages: 85, NumExtensions: 0, NumServices: 1, }, diff --git a/gen/proto/go/teleport/lib/teleterm/v1/service_grpc.pb.go b/gen/proto/go/teleport/lib/teleterm/v1/service_grpc.pb.go index 53af43ba0d284..e6b72d2e80cd4 100644 --- a/gen/proto/go/teleport/lib/teleterm/v1/service_grpc.pb.go +++ b/gen/proto/go/teleport/lib/teleterm/v1/service_grpc.pb.go @@ -41,6 +41,7 @@ const ( TerminalService_ListLeafClusters_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/ListLeafClusters" TerminalService_StartHeadlessWatcher_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/StartHeadlessWatcher" TerminalService_ListDatabaseUsers_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/ListDatabaseUsers" + TerminalService_ListDatabaseServers_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/ListDatabaseServers" TerminalService_GetServers_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/GetServers" TerminalService_GetAccessRequests_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/GetAccessRequests" TerminalService_GetAccessRequest_FullMethodName = "/teleport.lib.teleterm.v1.TerminalService/GetAccessRequest" @@ -109,6 +110,8 @@ type TerminalServiceClient interface { StartHeadlessWatcher(ctx context.Context, in *StartHeadlessWatcherRequest, opts ...grpc.CallOption) (*StartHeadlessWatcherResponse, error) // ListDatabaseUsers lists allowed users for the given database based on the role set. ListDatabaseUsers(ctx context.Context, in *ListDatabaseUsersRequest, opts ...grpc.CallOption) (*ListDatabaseUsersResponse, error) + // ListDatabaseServers lists allowed users for the given database based on the role set. + ListDatabaseServers(ctx context.Context, in *ListDatabaseServersRequest, opts ...grpc.CallOption) (*ListDatabaseServersResponse, error) // Deprecated: Do not use. // GetServers returns filtered, sorted, and paginated servers // @@ -288,6 +291,16 @@ func (c *terminalServiceClient) ListDatabaseUsers(ctx context.Context, in *ListD return out, nil } +func (c *terminalServiceClient) ListDatabaseServers(ctx context.Context, in *ListDatabaseServersRequest, opts ...grpc.CallOption) (*ListDatabaseServersResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListDatabaseServersResponse) + err := c.cc.Invoke(ctx, TerminalService_ListDatabaseServers_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // Deprecated: Do not use. func (c *terminalServiceClient) GetServers(ctx context.Context, in *GetServersRequest, opts ...grpc.CallOption) (*GetServersResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) @@ -712,6 +725,8 @@ type TerminalServiceServer interface { StartHeadlessWatcher(context.Context, *StartHeadlessWatcherRequest) (*StartHeadlessWatcherResponse, error) // ListDatabaseUsers lists allowed users for the given database based on the role set. ListDatabaseUsers(context.Context, *ListDatabaseUsersRequest) (*ListDatabaseUsersResponse, error) + // ListDatabaseServers lists allowed users for the given database based on the role set. + ListDatabaseServers(context.Context, *ListDatabaseServersRequest) (*ListDatabaseServersResponse, error) // Deprecated: Do not use. // GetServers returns filtered, sorted, and paginated servers // @@ -856,6 +871,9 @@ func (UnimplementedTerminalServiceServer) StartHeadlessWatcher(context.Context, func (UnimplementedTerminalServiceServer) ListDatabaseUsers(context.Context, *ListDatabaseUsersRequest) (*ListDatabaseUsersResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListDatabaseUsers not implemented") } +func (UnimplementedTerminalServiceServer) ListDatabaseServers(context.Context, *ListDatabaseServersRequest) (*ListDatabaseServersResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListDatabaseServers not implemented") +} func (UnimplementedTerminalServiceServer) GetServers(context.Context, *GetServersRequest) (*GetServersResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetServers not implemented") } @@ -1081,6 +1099,24 @@ func _TerminalService_ListDatabaseUsers_Handler(srv interface{}, ctx context.Con return interceptor(ctx, in, info, handler) } +func _TerminalService_ListDatabaseServers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListDatabaseServersRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TerminalServiceServer).ListDatabaseServers(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: TerminalService_ListDatabaseServers_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TerminalServiceServer).ListDatabaseServers(ctx, req.(*ListDatabaseServersRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _TerminalService_GetServers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetServersRequest) if err := dec(in); err != nil { @@ -1763,6 +1799,10 @@ var TerminalService_ServiceDesc = grpc.ServiceDesc{ MethodName: "ListDatabaseUsers", Handler: _TerminalService_ListDatabaseUsers_Handler, }, + { + MethodName: "ListDatabaseServers", + Handler: _TerminalService_ListDatabaseServers_Handler, + }, { MethodName: "GetServers", Handler: _TerminalService_GetServers_Handler, diff --git a/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.client.ts b/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.client.ts index f17bc94ad7e30..5e92fc2ef4293 100644 --- a/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.client.ts +++ b/gen/proto/ts/teleport/lib/teleterm/v1/service_pb.client.ts @@ -892,7 +892,7 @@ export class TerminalServiceClient implements ITerminalServiceClient, ServiceInf * @generated from protobuf rpc: SetSharedDirectoryForDesktopSession(teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionRequest) returns (teleport.lib.teleterm.v1.SetSharedDirectoryForDesktopSessionResponse); */ setSharedDirectoryForDesktopSession(input: SetSharedDirectoryForDesktopSessionRequest, options?: RpcOptions): UnaryCall { - const method = this.methods[42], opt = this._transport.mergeOptions(options); + const method = this.methods[43], opt = this._transport.mergeOptions(options); return stackIntercept("unary", this._transport, method, opt, input); } }