diff --git a/include/freerdp/peer.h b/include/freerdp/peer.h index 4b2afe0de..20d04b3d6 100644 --- a/include/freerdp/peer.h +++ b/include/freerdp/peer.h @@ -48,6 +48,7 @@ typedef BOOL (*psPeerPostConnect)(freerdp_peer* peer); typedef BOOL (*psPeerActivate)(freerdp_peer* peer); typedef BOOL (*psPeerLogon)(freerdp_peer* peer, SEC_WINNT_AUTH_IDENTITY* identity, BOOL automatic); typedef BOOL (*psPeerAdjustMonitorsLayout)(freerdp_peer* peer); +typedef BOOL (*psPeerClientCapabilities)(freerdp_peer* peer); typedef int (*psPeerSendChannelData)(freerdp_peer* peer, UINT16 channelId, BYTE* data, int size); typedef int (*psPeerReceiveChannelData)(freerdp_peer* peer, UINT16 channelId, BYTE* data, int size, @@ -116,6 +117,7 @@ struct rdp_freerdp_peer psPeerHasMoreToRead HasMoreToRead; psPeerGetEventHandles GetEventHandles; psPeerAdjustMonitorsLayout AdjustMonitorsLayout; + psPeerClientCapabilities ClientCapabilities; }; #ifdef __cplusplus diff --git a/libfreerdp/core/connection.c b/libfreerdp/core/connection.c index 9ed1235e8..c946f5753 100644 --- a/libfreerdp/core/connection.c +++ b/libfreerdp/core/connection.c @@ -1145,12 +1145,17 @@ BOOL rdp_server_accept_mcs_channel_join_request(rdpRdp* rdp, wStream* s) BOOL rdp_server_accept_confirm_active(rdpRdp* rdp, wStream* s) { + freerdp_peer *peer = rdp->context->peer; + if (rdp->state != CONNECTION_STATE_CAPABILITIES_EXCHANGE) return FALSE; if (!rdp_recv_confirm_active(rdp, s)) return FALSE; + if (peer->ClientCapabilities && !peer->ClientCapabilities(peer)) + return FALSE; + if (rdp->settings->SaltedChecksum) rdp->do_secure_checksum = TRUE;