From 7d48a587d2ecbf8c4e2bef12bf7e6e515c60c459 Mon Sep 17 00:00:00 2001 From: Kobi Mizrachi Date: Tue, 19 May 2020 14:57:15 +0300 Subject: [PATCH] server: proxy: prepare for exporting gfx capture to a module --- server/proxy/modules/demo/demo.cpp | 3 +++ server/proxy/modules/modules_api.h | 3 +++ server/proxy/pf_client.c | 3 +++ server/proxy/pf_modules.c | 16 ++++++++++++++-- server/proxy/pf_modules.h | 3 +++ server/proxy/pf_server.c | 1 + server/proxy/pf_update.c | 4 ++++ 7 files changed, 31 insertions(+), 2 deletions(-) diff --git a/server/proxy/modules/demo/demo.cpp b/server/proxy/modules/demo/demo.cpp index f50789a91..617cda037 100644 --- a/server/proxy/modules/demo/demo.cpp +++ b/server/proxy/modules/demo/demo.cpp @@ -55,10 +55,13 @@ static proxyPlugin demo_plugin = { plugin_desc, /* description */ demo_plugin_unload, /* PluginUnload */ NULL, /* ClientPreConnect */ + NULL, /* ClientPostConnect */ NULL, /* ClientLoginFailure */ + NULL, /* ClientEndPaint */ NULL, /* ServerPostConnect */ NULL, /* ServerChannelsInit */ NULL, /* ServerChannelsFree */ + NULL, /* ServerSessionEnd */ demo_filter_keyboard_event, /* KeyboardEvent */ NULL, /* MouseEvent */ NULL, /* ClientChannelData */ diff --git a/server/proxy/modules/modules_api.h b/server/proxy/modules/modules_api.h index bf380d303..4b9de1d58 100644 --- a/server/proxy/modules/modules_api.h +++ b/server/proxy/modules/modules_api.h @@ -48,10 +48,13 @@ typedef struct proxy_plugin /* proxy hooks. a module can set these function pointers to register hooks */ proxyHookFn ClientPreConnect; + proxyHookFn ClientPostConnect; proxyHookFn ClientLoginFailure; + proxyHookFn ClientEndPaint; proxyHookFn ServerPostConnect; proxyHookFn ServerChannelsInit; proxyHookFn ServerChannelsFree; + proxyHookFn ServerSessionEnd; /* proxy filters. a module can set these function pointers to register filters */ proxyFilterFn KeyboardEvent; diff --git a/server/proxy/pf_client.c b/server/proxy/pf_client.c index 56c722117..fd33e26c2 100644 --- a/server/proxy/pf_client.c +++ b/server/proxy/pf_client.c @@ -298,6 +298,9 @@ static BOOL pf_client_post_connect(freerdp* instance) ps = (rdpContext*)pc->pdata->ps; config = pc->pdata->config; + if (!pf_modules_run_hook(HOOK_TYPE_CLIENT_POST_CONNECT, pc->pdata)) + return FALSE; + if (config->SessionCapture) { if (!pf_capture_create_session_directory(pc)) diff --git a/server/proxy/pf_modules.c b/server/proxy/pf_modules.c index d8f32896d..daa81451e 100644 --- a/server/proxy/pf_modules.c +++ b/server/proxy/pf_modules.c @@ -47,8 +47,8 @@ static const char* FILTER_TYPE_STRINGS[] = { }; static const char* HOOK_TYPE_STRINGS[] = { - "CLIENT_PRE_CONNECT", "CLIENT_LOGIN_FAILURE", "SERVER_POST_CONNECT", - "SERVER_CHANNELS_INIT", "SERVER_CHANNELS_FREE", + "CLIENT_PRE_CONNECT", "CLIENT_POST_CONNECT", "CLIENT_LOGIN_FAILURE", "CLIENT_END_PAINT", + "SERVER_POST_CONNECT", "SERVER_CHANNELS_INIT", "SERVER_CHANNELS_FREE", "SERVER_SESSION_END", }; static const char* pf_modules_get_filter_type_string(PF_FILTER_TYPE result) @@ -89,10 +89,18 @@ BOOL pf_modules_run_hook(PF_HOOK_TYPE type, proxyData* pdata) IFCALLRET(plugin->ClientPreConnect, ok, pdata); break; + case HOOK_TYPE_CLIENT_POST_CONNECT: + IFCALLRET(plugin->ClientPostConnect, ok, pdata); + break; + case HOOK_TYPE_CLIENT_LOGIN_FAILURE: IFCALLRET(plugin->ClientLoginFailure, ok, pdata); break; + case HOOK_TYPE_CLIENT_END_PAINT: + IFCALLRET(plugin->ClientEndPaint, ok, pdata); + break; + case HOOK_TYPE_SERVER_POST_CONNECT: IFCALLRET(plugin->ServerPostConnect, ok, pdata); break; @@ -105,6 +113,10 @@ BOOL pf_modules_run_hook(PF_HOOK_TYPE type, proxyData* pdata) IFCALLRET(plugin->ServerChannelsFree, ok, pdata); break; + case HOOK_TYPE_SERVER_SESSION_END: + IFCALLRET(plugin->ServerSessionEnd, ok, pdata); + break; + default: WLog_ERR(TAG, "invalid hook called"); } diff --git a/server/proxy/pf_modules.h b/server/proxy/pf_modules.h index a8efd7f32..bb188c46d 100644 --- a/server/proxy/pf_modules.h +++ b/server/proxy/pf_modules.h @@ -41,11 +41,14 @@ typedef enum _PF_HOOK_TYPE PF_HOOK_TYPE; enum _PF_HOOK_TYPE { HOOK_TYPE_CLIENT_PRE_CONNECT, + HOOK_TYPE_CLIENT_POST_CONNECT, HOOK_TYPE_CLIENT_LOGIN_FAILURE, + HOOK_TYPE_CLIENT_END_PAINT, HOOK_TYPE_SERVER_POST_CONNECT, HOOK_TYPE_SERVER_CHANNELS_INIT, HOOK_TYPE_SERVER_CHANNELS_FREE, + HOOK_TYPE_SERVER_SESSION_END, HOOK_LAST }; diff --git a/server/proxy/pf_server.c b/server/proxy/pf_server.c index e0a64bed6..ba70952d0 100644 --- a/server/proxy/pf_server.c +++ b/server/proxy/pf_server.c @@ -420,6 +420,7 @@ fail: LOG_INFO(TAG, ps, "starting shutdown of connection"); LOG_INFO(TAG, ps, "stopping proxy's client"); freerdp_client_stop(pc); + pf_modules_run_hook(HOOK_TYPE_SERVER_SESSION_END, pdata); LOG_INFO(TAG, ps, "freeing server's channels"); pf_server_channels_free(ps); LOG_INFO(TAG, ps, "freeing proxy data"); diff --git a/server/proxy/pf_update.c b/server/proxy/pf_update.c index 83fed48ef..9debc0341 100644 --- a/server/proxy/pf_update.c +++ b/server/proxy/pf_update.c @@ -24,6 +24,7 @@ #include #include +#include "pf_modules.h" #include "pf_update.h" #include "pf_capture.h" #include "pf_context.h" @@ -78,6 +79,9 @@ static BOOL pf_client_end_paint(rdpContext* context) if (!ps->update->EndPaint(ps)) return FALSE; + if (!pf_modules_run_hook(HOOK_TYPE_CLIENT_END_PAINT, pdata)) + return FALSE; + if (!pdata->config->SessionCapture) return TRUE;