FreeRDP
Loading...
Searching...
No Matches
demo.cpp
1
22#include <iostream>
23
24#include <freerdp/api.h>
25#include <freerdp/scancode.h>
26#include <freerdp/server/proxy/proxy_modules_api.h>
27
28#define TAG MODULE_TAG("demo")
29
30struct demo_custom_data
31{
32 proxyPluginsManager* mgr;
33 int somesetting;
34};
35
36static constexpr char plugin_name[] = "demo";
37static constexpr char plugin_desc[] = "this is a test plugin";
38
39[[nodiscard]]
40static BOOL demo_plugin_unload([[maybe_unused]] proxyPlugin* plugin)
41{
42 WINPR_ASSERT(plugin);
43
44 std::cout << "C++ demo plugin: unloading..." << std::endl;
45
46 /* Here we have to free up our custom data storage. */
47 if (plugin)
48 delete static_cast<struct demo_custom_data*>(plugin->custom);
49
50 return TRUE;
51}
52
53[[nodiscard]]
54static BOOL demo_client_init_connect([[maybe_unused]] proxyPlugin* plugin,
55 [[maybe_unused]] proxyData* pdata,
56 [[maybe_unused]] void* custom)
57{
58 WINPR_ASSERT(plugin);
59 WINPR_ASSERT(pdata);
60 WINPR_ASSERT(custom);
61
62 WLog_INFO(TAG, "called");
63 return TRUE;
64}
65
66[[nodiscard]]
67static BOOL demo_client_uninit_connect([[maybe_unused]] proxyPlugin* plugin,
68 [[maybe_unused]] proxyData* pdata,
69 [[maybe_unused]] void* custom)
70{
71 WINPR_ASSERT(plugin);
72 WINPR_ASSERT(pdata);
73 WINPR_ASSERT(custom);
74
75 WLog_INFO(TAG, "called");
76 return TRUE;
77}
78
79[[nodiscard]]
80static BOOL demo_client_pre_connect([[maybe_unused]] proxyPlugin* plugin,
81 [[maybe_unused]] proxyData* pdata,
82 [[maybe_unused]] void* custom)
83{
84 WINPR_ASSERT(plugin);
85 WINPR_ASSERT(pdata);
86 WINPR_ASSERT(custom);
87
88 WLog_INFO(TAG, "called");
89 return TRUE;
90}
91
92[[nodiscard]]
93static BOOL demo_client_post_connect([[maybe_unused]] proxyPlugin* plugin,
94 [[maybe_unused]] proxyData* pdata,
95 [[maybe_unused]] void* custom)
96{
97 WINPR_ASSERT(plugin);
98 WINPR_ASSERT(pdata);
99 WINPR_ASSERT(custom);
100
101 WLog_INFO(TAG, "called");
102 return TRUE;
103}
104
105[[nodiscard]]
106static BOOL demo_client_post_disconnect([[maybe_unused]] proxyPlugin* plugin,
107 [[maybe_unused]] proxyData* pdata,
108 [[maybe_unused]] void* custom)
109{
110 WINPR_ASSERT(plugin);
111 WINPR_ASSERT(pdata);
112 WINPR_ASSERT(custom);
113
114 WLog_INFO(TAG, "called");
115 return TRUE;
116}
117
118[[nodiscard]]
119static BOOL demo_client_x509_certificate([[maybe_unused]] proxyPlugin* plugin,
120 [[maybe_unused]] proxyData* pdata,
121 [[maybe_unused]] void* custom)
122{
123 WINPR_ASSERT(plugin);
124 WINPR_ASSERT(pdata);
125 WINPR_ASSERT(custom);
126
127 WLog_INFO(TAG, "called");
128 return TRUE;
129}
130
131[[nodiscard]]
132static BOOL demo_client_login_failure([[maybe_unused]] proxyPlugin* plugin,
133 [[maybe_unused]] proxyData* pdata,
134 [[maybe_unused]] void* custom)
135{
136 WINPR_ASSERT(plugin);
137 WINPR_ASSERT(pdata);
138 WINPR_ASSERT(custom);
139
140 WLog_INFO(TAG, "called");
141 return TRUE;
142}
143
144[[nodiscard]]
145static BOOL demo_client_end_paint([[maybe_unused]] proxyPlugin* plugin,
146 [[maybe_unused]] proxyData* pdata, [[maybe_unused]] void* custom)
147{
148 WINPR_ASSERT(plugin);
149 WINPR_ASSERT(pdata);
150 WINPR_ASSERT(custom);
151
152 WLog_INFO(TAG, "called");
153 return TRUE;
154}
155
156[[nodiscard]]
157static BOOL demo_client_redirect([[maybe_unused]] proxyPlugin* plugin,
158 [[maybe_unused]] proxyData* pdata, [[maybe_unused]] void* custom)
159{
160 WINPR_ASSERT(plugin);
161 WINPR_ASSERT(pdata);
162 WINPR_ASSERT(custom);
163
164 WLog_INFO(TAG, "called");
165 return TRUE;
166}
167
168[[nodiscard]]
169static BOOL demo_server_post_connect([[maybe_unused]] proxyPlugin* plugin,
170 [[maybe_unused]] proxyData* pdata,
171 [[maybe_unused]] void* custom)
172{
173 WINPR_ASSERT(plugin);
174 WINPR_ASSERT(pdata);
175 WINPR_ASSERT(custom);
176
177 WLog_INFO(TAG, "called");
178 return TRUE;
179}
180
181[[nodiscard]]
182static BOOL demo_server_peer_activate([[maybe_unused]] proxyPlugin* plugin,
183 [[maybe_unused]] proxyData* pdata,
184 [[maybe_unused]] void* custom)
185{
186 WINPR_ASSERT(plugin);
187 WINPR_ASSERT(pdata);
188 WINPR_ASSERT(custom);
189
190 WLog_INFO(TAG, "called");
191 return TRUE;
192}
193
194[[nodiscard]]
195static BOOL demo_server_channels_init([[maybe_unused]] proxyPlugin* plugin,
196 [[maybe_unused]] proxyData* pdata,
197 [[maybe_unused]] void* custom)
198{
199 WINPR_ASSERT(plugin);
200 WINPR_ASSERT(pdata);
201 WINPR_ASSERT(custom);
202
203 WLog_INFO(TAG, "called");
204 return TRUE;
205}
206
207[[nodiscard]]
208static BOOL demo_server_channels_free([[maybe_unused]] proxyPlugin* plugin,
209 [[maybe_unused]] proxyData* pdata,
210 [[maybe_unused]] void* custom)
211{
212 WINPR_ASSERT(plugin);
213 WINPR_ASSERT(pdata);
214 WINPR_ASSERT(custom);
215
216 WLog_INFO(TAG, "called");
217 return TRUE;
218}
219
220[[nodiscard]]
221static BOOL demo_server_session_end([[maybe_unused]] proxyPlugin* plugin,
222 [[maybe_unused]] proxyData* pdata,
223 [[maybe_unused]] void* custom)
224{
225 WINPR_ASSERT(plugin);
226 WINPR_ASSERT(pdata);
227 WINPR_ASSERT(custom);
228
229 WLog_INFO(TAG, "called");
230 return TRUE;
231}
232
233[[nodiscard]]
234static BOOL demo_filter_keyboard_event([[maybe_unused]] proxyPlugin* plugin,
235 [[maybe_unused]] proxyData* pdata,
236 [[maybe_unused]] void* param)
237{
238 proxyPluginsManager* mgr = nullptr;
239 auto event_data = static_cast<const proxyKeyboardEventInfo*>(param);
240
241 WINPR_ASSERT(plugin);
242 WINPR_ASSERT(pdata);
243 WINPR_ASSERT(event_data);
244
245 mgr = plugin->mgr;
246 WINPR_ASSERT(mgr);
247
248 if (event_data == nullptr)
249 return FALSE;
250
251 if (event_data->rdp_scan_code == RDP_SCANCODE_KEY_B)
252 {
253 /* user typed 'B', that means bye :) */
254 std::cout << "C++ demo plugin: aborting connection" << std::endl;
255 mgr->AbortConnect(mgr, pdata);
256 }
257
258 return TRUE;
259}
260
261[[nodiscard]]
262static BOOL demo_filter_unicode_event([[maybe_unused]] proxyPlugin* plugin,
263 [[maybe_unused]] proxyData* pdata,
264 [[maybe_unused]] void* param)
265{
266 proxyPluginsManager* mgr = nullptr;
267 auto event_data = static_cast<const proxyUnicodeEventInfo*>(param);
268
269 WINPR_ASSERT(plugin);
270 WINPR_ASSERT(pdata);
271 WINPR_ASSERT(event_data);
272
273 mgr = plugin->mgr;
274 WINPR_ASSERT(mgr);
275
276 if (event_data == nullptr)
277 return FALSE;
278
279 if (event_data->code == 'b')
280 {
281 /* user typed 'B', that means bye :) */
282 std::cout << "C++ demo plugin: aborting connection" << std::endl;
283 mgr->AbortConnect(mgr, pdata);
284 }
285
286 return TRUE;
287}
288
289[[nodiscard]]
290static BOOL demo_mouse_event([[maybe_unused]] proxyPlugin* plugin,
291 [[maybe_unused]] proxyData* pdata, [[maybe_unused]] void* param)
292{
293 auto event_data = static_cast<const proxyMouseEventInfo*>(param);
294
295 WINPR_ASSERT(plugin);
296 WINPR_ASSERT(pdata);
297 WINPR_ASSERT(event_data);
298
299 WLog_INFO(TAG, "called %p", WINPR_CXX_COMPAT_CAST(const void*, event_data));
300 return TRUE;
301}
302
303[[nodiscard]]
304static BOOL demo_mouse_ex_event([[maybe_unused]] proxyPlugin* plugin,
305 [[maybe_unused]] proxyData* pdata, [[maybe_unused]] void* param)
306{
307 auto event_data = static_cast<const proxyMouseExEventInfo*>(param);
308
309 WINPR_ASSERT(plugin);
310 WINPR_ASSERT(pdata);
311 WINPR_ASSERT(event_data);
312
313 WLog_INFO(TAG, "called %p", WINPR_CXX_COMPAT_CAST(const void*, event_data));
314 return TRUE;
315}
316
317[[nodiscard]]
318static BOOL demo_client_channel_data([[maybe_unused]] proxyPlugin* plugin,
319 [[maybe_unused]] proxyData* pdata,
320 [[maybe_unused]] void* param)
321{
322 const auto* channel = static_cast<const proxyChannelDataEventInfo*>(param);
323
324 WINPR_ASSERT(plugin);
325 WINPR_ASSERT(pdata);
326 WINPR_ASSERT(channel);
327
328 WLog_INFO(TAG, "%s [0x%04" PRIx16 "] got %" PRIuz, channel->channel_name, channel->channel_id,
329 channel->data_len);
330 return TRUE;
331}
332
333[[nodiscard]]
334static BOOL demo_server_channel_data([[maybe_unused]] proxyPlugin* plugin,
335 [[maybe_unused]] proxyData* pdata,
336 [[maybe_unused]] void* param)
337{
338 const auto* channel = static_cast<const proxyChannelDataEventInfo*>(param);
339
340 WINPR_ASSERT(plugin);
341 WINPR_ASSERT(pdata);
342 WINPR_ASSERT(channel);
343
344 WLog_WARN(TAG, "%s [0x%04" PRIx16 "] got %" PRIuz, channel->channel_name, channel->channel_id,
345 channel->data_len);
346 return TRUE;
347}
348
349[[nodiscard]]
350static BOOL demo_dynamic_channel_create([[maybe_unused]] proxyPlugin* plugin,
351 [[maybe_unused]] proxyData* pdata,
352 [[maybe_unused]] void* param)
353{
354 const auto* channel = static_cast<const proxyChannelDataEventInfo*>(param);
355
356 WINPR_ASSERT(plugin);
357 WINPR_ASSERT(pdata);
358 WINPR_ASSERT(channel);
359
360 WLog_WARN(TAG, "%s [0x%04" PRIx16 "]", channel->channel_name, channel->channel_id);
361 return TRUE;
362}
363
364[[nodiscard]]
365static BOOL demo_server_fetch_target_addr([[maybe_unused]] proxyPlugin* plugin,
366 [[maybe_unused]] proxyData* pdata,
367 [[maybe_unused]] void* param)
368{
369 auto event_data = static_cast<const proxyFetchTargetEventInfo*>(param);
370
371 WINPR_ASSERT(plugin);
372 WINPR_ASSERT(pdata);
373 WINPR_ASSERT(event_data);
374
375 WLog_INFO(TAG, "called %p", WINPR_CXX_COMPAT_CAST(const void*, event_data));
376 return TRUE;
377}
378
379[[nodiscard]]
380static BOOL demo_server_peer_logon([[maybe_unused]] proxyPlugin* plugin,
381 [[maybe_unused]] proxyData* pdata, [[maybe_unused]] void* param)
382{
383 auto info = static_cast<const proxyServerPeerLogon*>(param);
384 WINPR_ASSERT(plugin);
385 WINPR_ASSERT(pdata);
386 WINPR_ASSERT(info);
387 WINPR_ASSERT(info->identity);
388
389 WLog_INFO(TAG, "%d", info->automatic);
390 return TRUE;
391}
392
393[[nodiscard]]
394static BOOL demo_dyn_channel_intercept_list([[maybe_unused]] proxyPlugin* plugin,
395 [[maybe_unused]] proxyData* pdata,
396 [[maybe_unused]] void* arg)
397{
398 auto data = static_cast<proxyChannelToInterceptData*>(arg);
399
400 WINPR_ASSERT(plugin);
401 WINPR_ASSERT(pdata);
402 WINPR_ASSERT(data);
403
404 WLog_INFO(TAG, "%s: %p", __func__, WINPR_CXX_COMPAT_CAST(const void*, data));
405 return TRUE;
406}
407
408[[nodiscard]]
409static BOOL demo_static_channel_intercept_list([[maybe_unused]] proxyPlugin* plugin,
410 [[maybe_unused]] proxyData* pdata,
411 [[maybe_unused]] void* arg)
412{
413 auto data = static_cast<proxyChannelToInterceptData*>(arg);
414
415 WINPR_ASSERT(plugin);
416 WINPR_ASSERT(pdata);
417 WINPR_ASSERT(data);
418
419 WLog_INFO(TAG, "%s: %p", __func__, WINPR_CXX_COMPAT_CAST(const void*, data));
420 return TRUE;
421}
422
423[[nodiscard]]
424static BOOL demo_dyn_channel_intercept([[maybe_unused]] proxyPlugin* plugin,
425 [[maybe_unused]] proxyData* pdata,
426 [[maybe_unused]] void* arg)
427{
428 auto data = static_cast<proxyDynChannelInterceptData*>(arg);
429
430 WINPR_ASSERT(plugin);
431 WINPR_ASSERT(pdata);
432 WINPR_ASSERT(data);
433
434 WLog_INFO(TAG, "%s: %p", __func__, WINPR_CXX_COMPAT_CAST(const void*, data));
435 return TRUE;
436}
437
438[[nodiscard]]
439static BOOL int_proxy_module_entry_point(proxyPluginsManager* plugins_manager, void* userdata)
440{
441 struct demo_custom_data* custom = nullptr;
442 proxyPlugin plugin = {};
443
444 plugin.name = plugin_name;
445 plugin.description = plugin_desc;
446 plugin.PluginUnload = demo_plugin_unload;
447 plugin.ClientInitConnect = demo_client_init_connect;
448 plugin.ClientUninitConnect = demo_client_uninit_connect;
449 plugin.ClientPreConnect = demo_client_pre_connect;
450 plugin.ClientPostConnect = demo_client_post_connect;
451 plugin.ClientPostDisconnect = demo_client_post_disconnect;
452 plugin.ClientX509Certificate = demo_client_x509_certificate;
453 plugin.ClientLoginFailure = demo_client_login_failure;
454 plugin.ClientEndPaint = demo_client_end_paint;
455 plugin.ClientRedirect = demo_client_redirect;
456 plugin.ServerPostConnect = demo_server_post_connect;
457 plugin.ServerPeerActivate = demo_server_peer_activate;
458 plugin.ServerChannelsInit = demo_server_channels_init;
459 plugin.ServerChannelsFree = demo_server_channels_free;
460 plugin.ServerSessionEnd = demo_server_session_end;
461 plugin.KeyboardEvent = demo_filter_keyboard_event;
462 plugin.UnicodeEvent = demo_filter_unicode_event;
463 plugin.MouseEvent = demo_mouse_event;
464 plugin.MouseExEvent = demo_mouse_ex_event;
465 plugin.ClientChannelData = demo_client_channel_data;
466 plugin.ServerChannelData = demo_server_channel_data;
467 plugin.DynamicChannelCreate = demo_dynamic_channel_create;
468 plugin.ServerFetchTargetAddr = demo_server_fetch_target_addr;
469 plugin.ServerPeerLogon = demo_server_peer_logon;
470
471 plugin.StaticChannelToIntercept = demo_static_channel_intercept_list;
472 plugin.DynChannelToIntercept = demo_dyn_channel_intercept_list;
473 plugin.DynChannelIntercept = demo_dyn_channel_intercept;
474
475 plugin.userdata = userdata;
476
477 custom = new (struct demo_custom_data);
478 if (!custom)
479 return FALSE;
480
481 custom->mgr = plugins_manager;
482 custom->somesetting = 42;
483
484 plugin.custom = custom;
485 plugin.userdata = userdata;
486
487 return plugins_manager->RegisterPlugin(plugins_manager, &plugin);
488}
489
490#ifdef __cplusplus
491extern "C"
492{
493#endif
494#if defined(BUILD_SHARED_LIBS)
495 [[nodiscard]]
496 FREERDP_API BOOL proxy_module_entry_point(proxyPluginsManager* plugins_manager, void* userdata);
497
498 BOOL proxy_module_entry_point(proxyPluginsManager* plugins_manager, void* userdata)
499 {
500 return int_proxy_module_entry_point(plugins_manager, userdata);
501 }
502#else
503[[nodiscard]]
504FREERDP_API BOOL demo_proxy_module_entry_point(proxyPluginsManager* plugins_manager,
505 void* userdata);
506BOOL demo_proxy_module_entry_point(proxyPluginsManager* plugins_manager, void* userdata)
507{
508 return int_proxy_module_entry_point(plugins_manager, userdata);
509}
510#endif
511#ifdef __cplusplus
512}
513#endif