GUACAMOLE-249: Claim support only for RDP orders that are explicitly supported, independently of any FreeRDP defaults.

This commit is contained in:
Michael Jumper 2020-01-03 17:29:16 -08:00
parent 36f227586e
commit 1bc9384ea8
2 changed files with 19 additions and 25 deletions

View File

@ -1144,7 +1144,6 @@ static char* guac_rdp_strdup(const char* str) {
void guac_rdp_push_settings(guac_client* client, void guac_rdp_push_settings(guac_client* client,
guac_rdp_settings* guac_settings, freerdp* rdp) { guac_rdp_settings* guac_settings, freerdp* rdp) {
BOOL bitmap_cache = !guac_settings->disable_bitmap_caching;
rdpSettings* rdp_settings = rdp->settings; rdpSettings* rdp_settings = rdp->settings;
/* Authentication */ /* Authentication */
@ -1312,37 +1311,22 @@ void guac_rdp_push_settings(guac_client* client,
rdp_settings->LoadBalanceInfoLength = strlen(guac_settings->load_balance_info); rdp_settings->LoadBalanceInfoLength = strlen(guac_settings->load_balance_info);
} }
/* Order support */ rdp_settings->BitmapCacheEnabled = !guac_settings->disable_bitmap_caching;
rdp_settings->BitmapCacheEnabled = bitmap_cache;
rdp_settings->OffscreenSupportLevel = !guac_settings->disable_offscreen_caching; rdp_settings->OffscreenSupportLevel = !guac_settings->disable_offscreen_caching;
rdp_settings->GlyphSupportLevel = !guac_settings->disable_glyph_caching ? GLYPH_SUPPORT_FULL : GLYPH_SUPPORT_NONE; rdp_settings->GlyphSupportLevel = !guac_settings->disable_glyph_caching ? GLYPH_SUPPORT_FULL : GLYPH_SUPPORT_NONE;
rdp_settings->OsMajorType = OSMAJORTYPE_UNSPECIFIED; rdp_settings->OsMajorType = OSMAJORTYPE_UNSPECIFIED;
rdp_settings->OsMinorType = OSMINORTYPE_UNSPECIFIED; rdp_settings->OsMinorType = OSMINORTYPE_UNSPECIFIED;
rdp_settings->DesktopResize = TRUE; rdp_settings->DesktopResize = TRUE;
/* Claim support only for specific updates, independent of FreeRDP defaults */
ZeroMemory(rdp_settings->OrderSupport, GUAC_RDP_ORDER_SUPPORT_LENGTH);
rdp_settings->OrderSupport[NEG_DSTBLT_INDEX] = TRUE; rdp_settings->OrderSupport[NEG_DSTBLT_INDEX] = TRUE;
rdp_settings->OrderSupport[NEG_PATBLT_INDEX] = FALSE; /* PATBLT not implemented */
rdp_settings->OrderSupport[NEG_SCRBLT_INDEX] = TRUE; rdp_settings->OrderSupport[NEG_SCRBLT_INDEX] = TRUE;
rdp_settings->OrderSupport[NEG_OPAQUE_RECT_INDEX] = FALSE; /* PATBLT not implemented, and OPAQUE_RECT implies PATBLT */ rdp_settings->OrderSupport[NEG_MEMBLT_INDEX] = !guac_settings->disable_bitmap_caching;
rdp_settings->OrderSupport[NEG_DRAWNINEGRID_INDEX] = FALSE; rdp_settings->OrderSupport[NEG_MEMBLT_V2_INDEX] = !guac_settings->disable_bitmap_caching;
rdp_settings->OrderSupport[NEG_MULTIDSTBLT_INDEX] = FALSE; rdp_settings->OrderSupport[NEG_GLYPH_INDEX_INDEX] = !guac_settings->disable_glyph_caching;
rdp_settings->OrderSupport[NEG_MULTIPATBLT_INDEX] = FALSE; rdp_settings->OrderSupport[NEG_FAST_INDEX_INDEX] = !guac_settings->disable_glyph_caching;
rdp_settings->OrderSupport[NEG_MULTISCRBLT_INDEX] = FALSE; rdp_settings->OrderSupport[NEG_FAST_GLYPH_INDEX] = !guac_settings->disable_glyph_caching;
rdp_settings->OrderSupport[NEG_MULTIOPAQUERECT_INDEX] = FALSE;
rdp_settings->OrderSupport[NEG_MULTI_DRAWNINEGRID_INDEX] = FALSE;
rdp_settings->OrderSupport[NEG_LINETO_INDEX] = FALSE;
rdp_settings->OrderSupport[NEG_POLYLINE_INDEX] = FALSE;
rdp_settings->OrderSupport[NEG_MEMBLT_INDEX] = bitmap_cache;
rdp_settings->OrderSupport[NEG_MEM3BLT_INDEX] = FALSE;
rdp_settings->OrderSupport[NEG_MEMBLT_V2_INDEX] = bitmap_cache;
rdp_settings->OrderSupport[NEG_MEM3BLT_V2_INDEX] = FALSE;
rdp_settings->OrderSupport[NEG_SAVEBITMAP_INDEX] = FALSE;
rdp_settings->OrderSupport[NEG_GLYPH_INDEX_INDEX] = TRUE;
rdp_settings->OrderSupport[NEG_FAST_INDEX_INDEX] = TRUE;
rdp_settings->OrderSupport[NEG_FAST_GLYPH_INDEX] = TRUE;
rdp_settings->OrderSupport[NEG_POLYGON_SC_INDEX] = FALSE;
rdp_settings->OrderSupport[NEG_POLYGON_CB_INDEX] = FALSE;
rdp_settings->OrderSupport[NEG_ELLIPSE_SC_INDEX] = FALSE;
rdp_settings->OrderSupport[NEG_ELLIPSE_CB_INDEX] = FALSE;
} }

View File

@ -58,6 +58,16 @@
*/ */
#define GUAC_RDP_DEFAULT_RECORDING_NAME "recording" #define GUAC_RDP_DEFAULT_RECORDING_NAME "recording"
/**
* The number of entries contained within the OrderSupport BYTE array
* referenced by the rdpSettings structure. This value is defined by the RDP
* negotiation process (there are 32 bytes available within the order
* negotiation field sent during the connection handshake) and is hard-coded
* within FreeRDP. There is no public constant for this value defined within
* the FreeRDP headers.
*/
#define GUAC_RDP_ORDER_SUPPORT_LENGTH 32
/** /**
* All supported combinations of security types. * All supported combinations of security types.
*/ */