void guac_rdp_push_settings()

in src/protocols/rdp/settings.c [1530:2028]


void guac_rdp_push_settings(guac_client* client,
        guac_rdp_settings* guac_settings, freerdp* rdp) {

    rdpSettings* rdp_settings = GUAC_RDP_CONTEXT(rdp)->settings;

#ifdef HAVE_SETTERS_GETTERS
    /* Authentication */
    freerdp_settings_set_string(rdp_settings, FreeRDP_Domain, guac_strdup(guac_settings->domain));
    freerdp_settings_set_string(rdp_settings, FreeRDP_Username, guac_strdup(guac_settings->username));
    freerdp_settings_set_string(rdp_settings, FreeRDP_Password, guac_strdup(guac_settings->password));

    /* Connection */
    freerdp_settings_set_string(rdp_settings, FreeRDP_ServerHostname, guac_strdup(guac_settings->hostname));
    freerdp_settings_set_uint32(rdp_settings, FreeRDP_ServerPort, guac_settings->port);

    /* Session */

    freerdp_settings_set_uint32(rdp_settings, FreeRDP_DesktopWidth, guac_settings->width);
    freerdp_settings_set_uint32(rdp_settings, FreeRDP_DesktopHeight, guac_settings->height);
    freerdp_settings_set_uint32(rdp_settings, FreeRDP_ColorDepth, guac_settings->color_depth);
    freerdp_settings_set_string(rdp_settings, FreeRDP_AlternateShell, guac_strdup(guac_settings->initial_program));
    freerdp_settings_set_uint32(rdp_settings, FreeRDP_KeyboardLayout, guac_settings->server_layout->freerdp_keyboard_layout);


    /* Performance flags */
    /* Explicitly set flag value */
    freerdp_settings_set_uint32(rdp_settings, FreeRDP_PerformanceFlags, guac_rdp_get_performance_flags(guac_settings));

    /* Set explicit connection type to LAN to prevent auto-detection */
    freerdp_settings_set_uint32(rdp_settings, FreeRDP_ConnectionType, CONNECTION_TYPE_LAN);

    /* Always request frame markers */
    freerdp_settings_set_bool(rdp_settings, FreeRDP_FrameMarkerCommandEnabled, TRUE);
    freerdp_settings_set_bool(rdp_settings, FreeRDP_SurfaceFrameMarkerEnabled, TRUE);

    /* Enable RemoteFX / Graphics Pipeline */
    if (guac_settings->enable_gfx) {

        freerdp_settings_set_bool(rdp_settings, FreeRDP_SupportGraphicsPipeline, TRUE);
        freerdp_settings_set_bool(rdp_settings, FreeRDP_RemoteFxCodec, TRUE);

        if (freerdp_settings_get_uint32(rdp_settings, FreeRDP_ColorDepth) != RDP_GFX_REQUIRED_DEPTH) {
            guac_client_log(client, GUAC_LOG_WARNING, "Ignoring requested "
                    "color depth of %i bpp, as the RDP Graphics Pipeline "
                    "requires %i bpp.", freerdp_settings_get_uint32(rdp_settings, FreeRDP_ColorDepth), RDP_GFX_REQUIRED_DEPTH);
        }

        /* Required for RemoteFX / Graphics Pipeline */
        freerdp_settings_set_bool(rdp_settings, FreeRDP_FastPathOutput, TRUE);
        freerdp_settings_set_uint32(rdp_settings, FreeRDP_ColorDepth, RDP_GFX_REQUIRED_DEPTH);
        freerdp_settings_set_bool(rdp_settings, FreeRDP_SoftwareGdi, TRUE);

    }

    /* Set individual flags - some FreeRDP versions overwrite flags set by guac_rdp_get_performance_flags() above */
    freerdp_settings_set_bool(rdp_settings, FreeRDP_AllowFontSmoothing, guac_settings->font_smoothing_enabled);
    freerdp_settings_set_bool(rdp_settings, FreeRDP_DisableWallpaper, !guac_settings->wallpaper_enabled);
    freerdp_settings_set_bool(rdp_settings, FreeRDP_DisableFullWindowDrag, !guac_settings->full_window_drag_enabled);
    freerdp_settings_set_bool(rdp_settings, FreeRDP_DisableMenuAnims, !guac_settings->menu_animations_enabled);
    freerdp_settings_set_bool(rdp_settings, FreeRDP_DisableThemes, !guac_settings->theming_enabled);
    freerdp_settings_set_bool(rdp_settings, FreeRDP_AllowDesktopComposition, guac_settings->desktop_composition_enabled);

    /* Client name */
    if (guac_settings->client_name != NULL) {
        freerdp_settings_set_string(rdp_settings, FreeRDP_ClientHostname, 
                guac_strndup(guac_settings->client_name, RDP_CLIENT_HOSTNAME_SIZE));
    }

    /* Console */
    freerdp_settings_set_bool(rdp_settings, FreeRDP_ConsoleSession, guac_settings->console);
    freerdp_settings_set_bool(rdp_settings, FreeRDP_RemoteConsoleAudio, guac_settings->console_audio);

    /* Audio */
    freerdp_settings_set_bool(rdp_settings, FreeRDP_AudioPlayback, guac_settings->audio_enabled);

    /* Audio capture */
    freerdp_settings_set_bool(rdp_settings, FreeRDP_AudioCapture, guac_settings->enable_audio_input);

    /* Display Update channel */
    freerdp_settings_set_bool(rdp_settings, FreeRDP_SupportDisplayControl, 
            (guac_settings->resize_method == GUAC_RESIZE_DISPLAY_UPDATE));

    /* Timezone redirection */
    if (guac_settings->timezone) {
        if (setenv("TZ", guac_settings->timezone, 1)) {
            guac_client_log(client, GUAC_LOG_WARNING,
                "Unable to forward timezone: TZ environment variable "
                "could not be set: %s", strerror(errno));
        }
    }

    /* Device redirection */
    freerdp_settings_set_bool(rdp_settings, FreeRDP_DeviceRedirection, 
            (guac_settings->audio_enabled || guac_settings->drive_enabled || guac_settings->printing_enabled));

    /* Security */
    switch (guac_settings->security_mode) {

        /* Legacy RDP encryption */
        case GUAC_SECURITY_RDP:
            freerdp_settings_set_bool(rdp_settings, FreeRDP_RdpSecurity, TRUE);
            freerdp_settings_set_bool(rdp_settings, FreeRDP_TlsSecurity, FALSE);
            freerdp_settings_set_bool(rdp_settings, FreeRDP_NlaSecurity, FALSE);
            freerdp_settings_set_bool(rdp_settings, FreeRDP_ExtSecurity, FALSE);
            freerdp_settings_set_bool(rdp_settings, FreeRDP_UseRdpSecurityLayer, TRUE);
            freerdp_settings_set_uint32(rdp_settings, FreeRDP_EncryptionLevel, 
                    ENCRYPTION_LEVEL_CLIENT_COMPATIBLE);
            freerdp_settings_set_uint32(rdp_settings, FreeRDP_EncryptionMethods, 
                    ENCRYPTION_METHOD_40BIT | ENCRYPTION_METHOD_128BIT | ENCRYPTION_METHOD_FIPS);
            break;

        /* TLS encryption */
        case GUAC_SECURITY_TLS:
            freerdp_settings_set_bool(rdp_settings, FreeRDP_RdpSecurity, FALSE);
            freerdp_settings_set_bool(rdp_settings, FreeRDP_TlsSecurity, TRUE);
            freerdp_settings_set_bool(rdp_settings, FreeRDP_NlaSecurity, FALSE);
            freerdp_settings_set_bool(rdp_settings, FreeRDP_ExtSecurity, FALSE);
            break;

        /* Network level authentication */
        case GUAC_SECURITY_NLA:
            freerdp_settings_set_bool(rdp_settings, FreeRDP_RdpSecurity, FALSE);
            freerdp_settings_set_bool(rdp_settings, FreeRDP_TlsSecurity, FALSE);
            freerdp_settings_set_bool(rdp_settings, FreeRDP_NlaSecurity, TRUE);
            freerdp_settings_set_bool(rdp_settings, FreeRDP_ExtSecurity, FALSE);
            break;

        /* Extended network level authentication */
        case GUAC_SECURITY_EXTENDED_NLA:
            freerdp_settings_set_bool(rdp_settings, FreeRDP_RdpSecurity, FALSE);
            freerdp_settings_set_bool(rdp_settings, FreeRDP_TlsSecurity, FALSE);
            freerdp_settings_set_bool(rdp_settings, FreeRDP_NlaSecurity, FALSE);
            freerdp_settings_set_bool(rdp_settings, FreeRDP_ExtSecurity, TRUE);
            break;

        /* Hyper-V "VMConnect" negotiation mode */
        case GUAC_SECURITY_VMCONNECT:
            freerdp_settings_set_bool(rdp_settings, FreeRDP_RdpSecurity, FALSE);
            freerdp_settings_set_bool(rdp_settings, FreeRDP_TlsSecurity, TRUE);
            freerdp_settings_set_bool(rdp_settings, FreeRDP_NlaSecurity, TRUE);
            freerdp_settings_set_bool(rdp_settings, FreeRDP_ExtSecurity, FALSE);
            freerdp_settings_set_bool(rdp_settings, FreeRDP_VmConnectMode, TRUE);
            break;

        /* All security types */
        case GUAC_SECURITY_ANY:
            freerdp_settings_set_bool(rdp_settings, FreeRDP_RdpSecurity, TRUE);
            freerdp_settings_set_bool(rdp_settings, FreeRDP_TlsSecurity, TRUE);

            /* Explicitly disable NLA if FIPS mode is enabled - it won't work */
            if (guac_fips_enabled()) {

                guac_client_log(client, GUAC_LOG_INFO,
                        "FIPS mode is enabled. Excluding NLA security mode from security negotiation "
                        "(see: https://github.com/FreeRDP/FreeRDP/issues/3412).");
                freerdp_settings_set_bool(rdp_settings, FreeRDP_NlaSecurity, FALSE);

            }

            /* NLA mode is allowed if FIPS is not enabled */
            else
                freerdp_settings_set_bool(rdp_settings, FreeRDP_NlaSecurity, TRUE);

            freerdp_settings_set_bool(rdp_settings, FreeRDP_ExtSecurity, FALSE);
            break;

    }

    /* Security */
    freerdp_settings_set_bool(rdp_settings, FreeRDP_Authentication, !guac_settings->disable_authentication);
    freerdp_settings_set_bool(rdp_settings, FreeRDP_IgnoreCertificate, guac_settings->ignore_certificate);
    freerdp_settings_set_bool(rdp_settings, FreeRDP_AutoAcceptCertificate, guac_settings->certificate_tofu);
    if (guac_settings->certificate_fingerprints != NULL)
        freerdp_settings_set_string(rdp_settings, FreeRDP_CertificateAcceptedFingerprints, 
                guac_strdup(guac_settings->certificate_fingerprints));


    /* RemoteApp */
    if (guac_settings->remote_app != NULL) {
        freerdp_settings_set_bool(rdp_settings, FreeRDP_Workarea, TRUE);
        freerdp_settings_set_bool(rdp_settings, FreeRDP_RemoteApplicationMode, TRUE);
        freerdp_settings_set_bool(rdp_settings, FreeRDP_RemoteAppLanguageBarSupported, TRUE);
        freerdp_settings_set_string(rdp_settings, FreeRDP_RemoteApplicationProgram, guac_strdup(guac_settings->remote_app));
        freerdp_settings_set_string(rdp_settings, FreeRDP_ShellWorkingDirectory, guac_strdup(guac_settings->remote_app_dir));
        freerdp_settings_set_string(rdp_settings, FreeRDP_RemoteApplicationCmdLine, guac_strdup(guac_settings->remote_app_args));
    }

    /* Preconnection ID */
    if (guac_settings->preconnection_id != -1) {
        freerdp_settings_set_bool(rdp_settings, FreeRDP_NegotiateSecurityLayer, FALSE);
        freerdp_settings_set_bool(rdp_settings, FreeRDP_SendPreconnectionPdu, TRUE);
        freerdp_settings_set_uint32(rdp_settings, FreeRDP_PreconnectionId, guac_settings->preconnection_id);
    }

    /* Preconnection BLOB */
    if (guac_settings->preconnection_blob != NULL) {
        freerdp_settings_set_bool(rdp_settings, FreeRDP_NegotiateSecurityLayer, FALSE);
        freerdp_settings_set_bool(rdp_settings, FreeRDP_SendPreconnectionPdu, TRUE);
        freerdp_settings_set_string(rdp_settings, FreeRDP_PreconnectionBlob, guac_strdup(guac_settings->preconnection_blob));
    }

    /* Enable use of RD gateway if a gateway hostname is provided */
    if (guac_settings->gateway_hostname != NULL) {

        /* Enable RD gateway */
        freerdp_settings_set_bool(rdp_settings, FreeRDP_GatewayEnabled, TRUE);

        /* RD gateway connection details */
        freerdp_settings_set_string(rdp_settings, FreeRDP_GatewayHostname, guac_strdup(guac_settings->gateway_hostname));
        freerdp_settings_set_uint32(rdp_settings, FreeRDP_GatewayPort, guac_settings->gateway_port);

        /* RD gateway credentials */
        freerdp_settings_set_bool(rdp_settings, FreeRDP_GatewayUseSameCredentials, FALSE);
        freerdp_settings_set_string(rdp_settings, FreeRDP_GatewayDomain, guac_strdup(guac_settings->gateway_domain));
        freerdp_settings_set_string(rdp_settings, FreeRDP_GatewayUsername, guac_strdup(guac_settings->gateway_username));
        freerdp_settings_set_string(rdp_settings, FreeRDP_GatewayPassword, guac_strdup(guac_settings->gateway_password));

    }

    /* Store load balance info (and calculate length) if provided */
    if (guac_settings->load_balance_info != NULL) {
        freerdp_settings_set_pointer(rdp_settings, FreeRDP_LoadBalanceInfo, (BYTE*) guac_strdup(guac_settings->load_balance_info));
        freerdp_settings_set_uint32(rdp_settings, FreeRDP_LoadBalanceInfoLength, strlen(guac_settings->load_balance_info));
    }

    freerdp_settings_set_bool(rdp_settings, FreeRDP_BitmapCacheEnabled, !guac_settings->disable_bitmap_caching);
    freerdp_settings_set_uint32(rdp_settings, FreeRDP_OffscreenSupportLevel, !guac_settings->disable_offscreen_caching);
    freerdp_settings_set_uint32(rdp_settings, FreeRDP_GlyphSupportLevel, 
            (!guac_settings->disable_glyph_caching ? GLYPH_SUPPORT_FULL : GLYPH_SUPPORT_NONE));
    freerdp_settings_set_uint32(rdp_settings, FreeRDP_OsMajorType, OSMAJORTYPE_UNSPECIFIED);
    freerdp_settings_set_uint32(rdp_settings, FreeRDP_OsMinorType, OSMINORTYPE_UNSPECIFIED);
    freerdp_settings_set_bool(rdp_settings, FreeRDP_DesktopResize, TRUE);

    /* Claim support only for specific updates, independent of FreeRDP defaults */
	BYTE* order_support = freerdp_settings_get_pointer_writable(rdp_settings, FreeRDP_OrderSupport);
	if (order_support) {
        ZeroMemory(order_support, GUAC_RDP_ORDER_SUPPORT_LENGTH);
        order_support[NEG_DSTBLT_INDEX] = TRUE;
        order_support[NEG_SCRBLT_INDEX] = TRUE;
        order_support[NEG_MEMBLT_INDEX] = !guac_settings->disable_bitmap_caching;
        order_support[NEG_MEMBLT_V2_INDEX] = !guac_settings->disable_bitmap_caching;
        order_support[NEG_GLYPH_INDEX_INDEX] = !guac_settings->disable_glyph_caching;
        order_support[NEG_FAST_INDEX_INDEX] = !guac_settings->disable_glyph_caching;
        order_support[NEG_FAST_GLYPH_INDEX] = !guac_settings->disable_glyph_caching;
    }

#ifdef HAVE_RDPSETTINGS_ALLOWUNANOUNCEDORDERSFROMSERVER
    /* Do not consider server use of unannounced orders to be a fatal error */
    freerdp_settings_set_bool(rdp_settings, FreeRDP_AllowUnanouncedOrdersFromServer, TRUE);
#endif

#else
    /* Authentication */
    rdp_settings->Domain = guac_strdup(guac_settings->domain);
    rdp_settings->Username = guac_strdup(guac_settings->username);
    rdp_settings->Password = guac_strdup(guac_settings->password);

    /* Connection */
    rdp_settings->ServerHostname = guac_strdup(guac_settings->hostname);
    rdp_settings->ServerPort = guac_settings->port;
    rdp_settings->TcpAckTimeout = guac_settings->timeout * 1000;

    /* Session */
    rdp_settings->ColorDepth = guac_settings->color_depth;
    rdp_settings->DesktopWidth = guac_settings->width;
    rdp_settings->DesktopHeight = guac_settings->height;
    rdp_settings->AlternateShell = guac_strdup(guac_settings->initial_program);
    rdp_settings->KeyboardLayout = guac_settings->server_layout->freerdp_keyboard_layout;

    /* Performance flags */
    /* Explicitly set flag value */
    rdp_settings->PerformanceFlags = guac_rdp_get_performance_flags(guac_settings);

    /* Set explicit connection type to LAN to prevent auto-detection */
    freerdp_settings_set_uint32(rdp_settings, FreeRDP_ConnectionType, CONNECTION_TYPE_LAN);

    /* Always request frame markers */
    rdp_settings->FrameMarkerCommandEnabled = TRUE;
    rdp_settings->SurfaceFrameMarkerEnabled = TRUE;

    /* Always handle input events asynchronously (rather than synchronously
     * with the rest of FreeRDP's event loop, including graphics) */
    rdp_settings->AsyncInput = TRUE;

    /* Enable RemoteFX / Graphics Pipeline */
    if (guac_settings->enable_gfx) {

        rdp_settings->SupportGraphicsPipeline = TRUE;
        rdp_settings->RemoteFxCodec = TRUE;

        if (rdp_settings->ColorDepth != RDP_GFX_REQUIRED_DEPTH) {
            guac_client_log(client, GUAC_LOG_WARNING, "Ignoring requested "
                    "color depth of %i bpp, as the RDP Graphics Pipeline "
                    "requires %i bpp.", rdp_settings->ColorDepth, RDP_GFX_REQUIRED_DEPTH);
        }

        /* Required for RemoteFX / Graphics Pipeline */
        rdp_settings->FastPathOutput = TRUE;
        rdp_settings->ColorDepth = RDP_GFX_REQUIRED_DEPTH;
        rdp_settings->SoftwareGdi = TRUE;

    }

    /* Set individual flags - some FreeRDP versions overwrite flags set by guac_rdp_get_performance_flags() above */
    rdp_settings->AllowFontSmoothing = guac_settings->font_smoothing_enabled;
    rdp_settings->DisableWallpaper = !guac_settings->wallpaper_enabled;
    rdp_settings->DisableFullWindowDrag = !guac_settings->full_window_drag_enabled;
    rdp_settings->DisableMenuAnims = !guac_settings->menu_animations_enabled;
    rdp_settings->DisableThemes = !guac_settings->theming_enabled;
    rdp_settings->AllowDesktopComposition = guac_settings->desktop_composition_enabled;

    /* Client name */
    if (guac_settings->client_name != NULL) {
        free(rdp_settings->ClientHostname);
        rdp_settings->ClientHostname = guac_strndup(guac_settings->client_name,
                RDP_CLIENT_HOSTNAME_SIZE);
    }

    /* Console */
    rdp_settings->ConsoleSession = guac_settings->console;
    rdp_settings->RemoteConsoleAudio = guac_settings->console_audio;

    /* Audio */
    rdp_settings->AudioPlayback = guac_settings->audio_enabled;

    /* Audio capture */
    rdp_settings->AudioCapture = guac_settings->enable_audio_input;

    /* Display Update channel */
    rdp_settings->SupportDisplayControl =
        (guac_settings->resize_method == GUAC_RESIZE_DISPLAY_UPDATE);

    /* Timezone redirection */
    if (guac_settings->timezone) {
        if (setenv("TZ", guac_settings->timezone, 1)) {
            guac_client_log(client, GUAC_LOG_WARNING,
                "Unable to forward timezone: TZ environment variable "
                "could not be set: %s", strerror(errno));
        }
    }

    /* Device redirection */
    rdp_settings->DeviceRedirection =  guac_settings->audio_enabled
                                    || guac_settings->drive_enabled
                                    || guac_settings->printing_enabled;

    /* Security */
    switch (guac_settings->security_mode) {

        /* Legacy RDP encryption */
        case GUAC_SECURITY_RDP:
            rdp_settings->RdpSecurity = TRUE;
            rdp_settings->TlsSecurity = FALSE;
            rdp_settings->NlaSecurity = FALSE;
            rdp_settings->ExtSecurity = FALSE;
            rdp_settings->UseRdpSecurityLayer = TRUE;
            rdp_settings->EncryptionLevel = ENCRYPTION_LEVEL_CLIENT_COMPATIBLE;
            rdp_settings->EncryptionMethods =
                  ENCRYPTION_METHOD_40BIT
                | ENCRYPTION_METHOD_128BIT 
                | ENCRYPTION_METHOD_FIPS;
            break;

        /* TLS encryption */
        case GUAC_SECURITY_TLS:
            rdp_settings->RdpSecurity = FALSE;
            rdp_settings->TlsSecurity = TRUE;
            rdp_settings->NlaSecurity = FALSE;
            rdp_settings->ExtSecurity = FALSE;
            break;

        /* Network level authentication */
        case GUAC_SECURITY_NLA:
            rdp_settings->RdpSecurity = FALSE;
            rdp_settings->TlsSecurity = FALSE;
            rdp_settings->NlaSecurity = TRUE;
            rdp_settings->ExtSecurity = FALSE;
            break;

        /* Extended network level authentication */
        case GUAC_SECURITY_EXTENDED_NLA:
            rdp_settings->RdpSecurity = FALSE;
            rdp_settings->TlsSecurity = FALSE;
            rdp_settings->NlaSecurity = FALSE;
            rdp_settings->ExtSecurity = TRUE;
            break;

        /* Hyper-V "VMConnect" negotiation mode */
        case GUAC_SECURITY_VMCONNECT:
            rdp_settings->RdpSecurity = FALSE;
            rdp_settings->TlsSecurity = TRUE;
            rdp_settings->NlaSecurity = TRUE;
            rdp_settings->ExtSecurity = FALSE;
            rdp_settings->VmConnectMode = TRUE;
            break;

        /* All security types */
        case GUAC_SECURITY_ANY:
            rdp_settings->RdpSecurity = TRUE;
            rdp_settings->TlsSecurity = TRUE;

            /* Explicitly disable NLA if FIPS mode is enabled - it won't work */
            if (guac_fips_enabled()) {

                guac_client_log(client, GUAC_LOG_INFO,
                        "FIPS mode is enabled. Excluding NLA security mode from security negotiation "
                        "(see: https://github.com/FreeRDP/FreeRDP/issues/3412).");
                rdp_settings->NlaSecurity = FALSE;

            }

            /* NLA mode is allowed if FIPS is not enabled */
            else
                rdp_settings->NlaSecurity = TRUE;

            rdp_settings->ExtSecurity = FALSE;
            break;

    }

    /* Security */
    rdp_settings->Authentication = !guac_settings->disable_authentication;
    rdp_settings->IgnoreCertificate = guac_settings->ignore_certificate;
    rdp_settings->AutoAcceptCertificate = guac_settings->certificate_tofu;
    if (guac_settings->certificate_fingerprints != NULL)
        rdp_settings->CertificateAcceptedFingerprints = guac_strdup(guac_settings->certificate_fingerprints);

    /* RemoteApp */
    if (guac_settings->remote_app != NULL) {
        rdp_settings->Workarea = TRUE;
        rdp_settings->RemoteApplicationMode = TRUE;
        rdp_settings->RemoteAppLanguageBarSupported = TRUE;
        rdp_settings->RemoteApplicationProgram = guac_strdup(guac_settings->remote_app);
        rdp_settings->ShellWorkingDirectory = guac_strdup(guac_settings->remote_app_dir);
        rdp_settings->RemoteApplicationCmdLine = guac_strdup(guac_settings->remote_app_args);
    }

    /* Preconnection ID */
    if (guac_settings->preconnection_id != -1) {
        rdp_settings->NegotiateSecurityLayer = FALSE;
        rdp_settings->SendPreconnectionPdu = TRUE;
        rdp_settings->PreconnectionId = guac_settings->preconnection_id;
    }

    /* Preconnection BLOB */
    if (guac_settings->preconnection_blob != NULL) {
        rdp_settings->NegotiateSecurityLayer = FALSE;
        rdp_settings->SendPreconnectionPdu = TRUE;
        rdp_settings->PreconnectionBlob = guac_strdup(guac_settings->preconnection_blob);
    }

    /* Enable use of RD gateway if a gateway hostname is provided */
    if (guac_settings->gateway_hostname != NULL) {

        /* Enable RD gateway */
        rdp_settings->GatewayEnabled = TRUE;

        /* RD gateway connection details */
        rdp_settings->GatewayHostname = guac_strdup(guac_settings->gateway_hostname);
        rdp_settings->GatewayPort = guac_settings->gateway_port;

        /* RD gateway credentials */
        rdp_settings->GatewayUseSameCredentials = FALSE;
        rdp_settings->GatewayDomain = guac_strdup(guac_settings->gateway_domain);
        rdp_settings->GatewayUsername = guac_strdup(guac_settings->gateway_username);
        rdp_settings->GatewayPassword = guac_strdup(guac_settings->gateway_password);

    }

    /* Store load balance info (and calculate length) if provided */
    if (guac_settings->load_balance_info != NULL) {
        rdp_settings->LoadBalanceInfo = (BYTE*) guac_strdup(guac_settings->load_balance_info);
        rdp_settings->LoadBalanceInfoLength = strlen(guac_settings->load_balance_info);
    }

    rdp_settings->BitmapCacheEnabled = !guac_settings->disable_bitmap_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->OsMajorType = OSMAJORTYPE_UNSPECIFIED;
    rdp_settings->OsMinorType = OSMINORTYPE_UNSPECIFIED;
    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_SCRBLT_INDEX] = TRUE;
    rdp_settings->OrderSupport[NEG_MEMBLT_INDEX] = !guac_settings->disable_bitmap_caching;
    rdp_settings->OrderSupport[NEG_MEMBLT_V2_INDEX] = !guac_settings->disable_bitmap_caching;
    rdp_settings->OrderSupport[NEG_GLYPH_INDEX_INDEX] = !guac_settings->disable_glyph_caching;
    rdp_settings->OrderSupport[NEG_FAST_INDEX_INDEX] = !guac_settings->disable_glyph_caching;
    rdp_settings->OrderSupport[NEG_FAST_GLYPH_INDEX] = !guac_settings->disable_glyph_caching;

#ifdef HAVE_RDPSETTINGS_ALLOWUNANOUNCEDORDERSFROMSERVER
    /* Do not consider server use of unannounced orders to be a fatal error */
    rdp_settings->AllowUnanouncedOrdersFromServer = TRUE;
#endif

#endif
}