From e5a5da48523b9f4a1facdb1557c29fb5a42cce3b Mon Sep 17 00:00:00 2001 From: Isaiah Becker-Mayer Date: Fri, 3 May 2024 19:57:02 -0700 Subject: [PATCH 1/2] Ignores resizes when a desktop has `screen_size` set `screen_size` is meant to be a static override of the screen size, however this property was mistakenly lost when https://github.com/gravitational/teleport/pull/39819 was merged. This commit restores the behavior of `screen_size` by ignoring resizes when it is set. --- lib/srv/desktop/rdp/rdpclient/client.go | 8 +++++++- lib/srv/desktop/rdp/rdpclient/client_common.go | 7 +++++++ .../teleport/src/DesktopSession/useTdpClientCanvas.tsx | 1 - 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/srv/desktop/rdp/rdpclient/client.go b/lib/srv/desktop/rdp/rdpclient/client.go index 9a9b18ebff4b1..dbd134fa20333 100644 --- a/lib/srv/desktop/rdp/rdpclient/client.go +++ b/lib/srv/desktop/rdp/rdpclient/client.go @@ -239,7 +239,7 @@ func (c *Client) readClientSize() error { continue } - if c.cfg.Width != 0 && c.cfg.Height != 0 { + if c.cfg.hasOverrideSize() { // Some desktops have a screen size in their resource definition. // If non-zero then we always request this screen size. c.cfg.Logger.DebugContext(context.Background(), "Forcing a fixed screen size", "width", c.cfg.Width, "height", c.cfg.Height) @@ -394,6 +394,12 @@ func (c *Client) startInputStreaming(stopCh chan struct{}) error { switch m := msg.(type) { case tdp.ClientScreenSpec: + // If the client has specified a fixed screen size, we don't + // need to send a screen resize event. + if c.cfg.hasOverrideSize() { + continue + } + c.cfg.Logger.DebugContext(context.Background(), "Client changed screen size", "width", m.Width, "height", m.Height) if errCode := C.client_write_screen_resize( C.ulong(c.handle), diff --git a/lib/srv/desktop/rdp/rdpclient/client_common.go b/lib/srv/desktop/rdp/rdpclient/client_common.go index 0fce57c16950f..d638f2590fdb1 100644 --- a/lib/srv/desktop/rdp/rdpclient/client_common.go +++ b/lib/srv/desktop/rdp/rdpclient/client_common.go @@ -94,3 +94,10 @@ func (c *Config) checkAndSetDefaults() error { c.Logger = c.Logger.With("rdp-addr", c.Addr) return nil } + +// hasOverrideSize returns true if the width and height have been set. +// This will be true when a user has specified a fixed `screen_size` for +// a given desktop. +func (c *Config) hasOverrideSize() bool { + return c.Width != 0 && c.Height != 0 +} diff --git a/web/packages/teleport/src/DesktopSession/useTdpClientCanvas.tsx b/web/packages/teleport/src/DesktopSession/useTdpClientCanvas.tsx index 3373c2f420b4d..0ecf22561b0f0 100644 --- a/web/packages/teleport/src/DesktopSession/useTdpClientCanvas.tsx +++ b/web/packages/teleport/src/DesktopSession/useTdpClientCanvas.tsx @@ -126,7 +126,6 @@ export default function useTdpClientCanvas(props: Props) { ) => { // The first image fragment we see signals a successful TDP connection. if (!initialTdpConnectionSucceeded.current) { - syncCanvas(ctx.canvas, getDisplaySize()); setTdpConnection({ status: 'success' }); initialTdpConnectionSucceeded.current = true; } From e58e0a11799a72b62262c5ec1b8450eaf4d5434a Mon Sep 17 00:00:00 2001 From: Isaiah Becker-Mayer Date: Mon, 6 May 2024 13:17:07 -0700 Subject: [PATCH 2/2] hasSizeOverride and //nolint --- lib/srv/desktop/rdp/rdpclient/client.go | 4 ++-- lib/srv/desktop/rdp/rdpclient/client_common.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/srv/desktop/rdp/rdpclient/client.go b/lib/srv/desktop/rdp/rdpclient/client.go index dbd134fa20333..54550fd58c71f 100644 --- a/lib/srv/desktop/rdp/rdpclient/client.go +++ b/lib/srv/desktop/rdp/rdpclient/client.go @@ -239,7 +239,7 @@ func (c *Client) readClientSize() error { continue } - if c.cfg.hasOverrideSize() { + if c.cfg.hasSizeOverride() { // Some desktops have a screen size in their resource definition. // If non-zero then we always request this screen size. c.cfg.Logger.DebugContext(context.Background(), "Forcing a fixed screen size", "width", c.cfg.Width, "height", c.cfg.Height) @@ -396,7 +396,7 @@ func (c *Client) startInputStreaming(stopCh chan struct{}) error { case tdp.ClientScreenSpec: // If the client has specified a fixed screen size, we don't // need to send a screen resize event. - if c.cfg.hasOverrideSize() { + if c.cfg.hasSizeOverride() { continue } diff --git a/lib/srv/desktop/rdp/rdpclient/client_common.go b/lib/srv/desktop/rdp/rdpclient/client_common.go index d638f2590fdb1..7861f9b57ffef 100644 --- a/lib/srv/desktop/rdp/rdpclient/client_common.go +++ b/lib/srv/desktop/rdp/rdpclient/client_common.go @@ -95,9 +95,9 @@ func (c *Config) checkAndSetDefaults() error { return nil } -// hasOverrideSize returns true if the width and height have been set. +// hasSizeOverride returns true if the width and height have been set. // This will be true when a user has specified a fixed `screen_size` for // a given desktop. -func (c *Config) hasOverrideSize() bool { +func (c *Config) hasSizeOverride() bool { //nolint:unused // used in client.go that is behind desktop_access_rdp build flag return c.Width != 0 && c.Height != 0 }