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