From 84cc78074ad96bbf16d24736008eb4fe7143de3d Mon Sep 17 00:00:00 2001 From: Isaiah Becker-Mayer Date: Mon, 6 May 2024 17:45:07 -0500 Subject: [PATCH] Ignores resizes when a desktop has `screen_size` set (#41198) (#41241) * 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. * hasSizeOverride and //nolint --- 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 2d15ca0f23394..5a4eab7805e85 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.hasSizeOverride() { // Some desktops have a screen size in their resource definition. // If non-zero then we always request this screen size. c.cfg.Log.Debugf("Forcing a screen size of %dx%d", c.cfg.Width, 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.hasSizeOverride() { + continue + } + c.cfg.Log.Debugf("Client changed screen size: %d x %d", m.Width, 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 56b6dca9465a8..9efe72dad2e18 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.Log = c.Log.WithField("rdp-addr", c.Addr) return nil } + +// 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) hasSizeOverride() bool { //nolint:unused // used in client.go that is behind desktop_access_rdp build flag + 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; }