FreeRDP/server/proxy/modules
Joan Torres 2079455eec [proxy,modules] allow compiling with old c++ compiler
For dyn-channel-dump.

On C++17 there's the filesystem standard library.
Newer c++ compilers use it with <filesystem>.
However, older c++ compilers use it with <experimental/filesystem>.
2023-12-18 14:11:37 +01:00
..
bitmap-filter [proxy,modules] explicitly build shared libraries 2023-12-14 14:05:39 +01:00
capture [proxy,modules] explicitly build shared libraries 2023-12-14 14:05:39 +01:00
demo [proxy,modules] explicitly build shared libraries 2023-12-14 14:05:39 +01:00
dyn-channel-dump [proxy,modules] allow compiling with old c++ compiler 2023-12-18 14:11:37 +01:00
CMakeLists.txt Replaced CMAKE_[SOURCE|BINARY]_DIR with PROJECT_[SOURCE|BINARY]_DIR 2021-06-22 08:54:18 +02:00
README.md Refactored proxy and proxy-modules: 2021-09-09 08:53:20 +02:00

Proxy module API

freerdp-proxy has an API for hooking/filtering certain events/messages. A module can register callbacks to events, allowing to record the data and control whether to pass/ignore, or right out drop the connection.

During startup, the proxy reads its modules from the configuration:

[Plugins]
Modules = demo,cap

These modules are loaded in a best effort manner. Additionally there is a configuration field for modules that must be loaded, so the proxy refuses to start if they are not found:

[Plugins]
Required = demo,cap

Modules must be installed as shared libraris in the <base install>/lib/freerdp3/proxy folder and match the pattern proxy-<name>-plugin.<ext> (e.g. proxy-demo-plugin.so) to be found. For security reasons loading by full path is not supported and only the installation path is used for lookup.

Currently supported hook events

Client

  • ClientInitConnect: Called before the client tries to open a connection
  • ClientUninitConnect: Called after the client has disconnected
  • ClientPreConnect: Called in client PreConnect callback
  • ClientPostConnect: Called in client PostConnect callback
  • ClientPostDisconnect: Called in client PostDisconnect callback
  • ClientX509Certificate: Called in client X509 certificate verification callback
  • ClientLoginFailure: Called in client login failure callback
  • ClientEndPaint: Called in client EndPaint callback

Server

  • ServerPostConnect: Called after a client has connected
  • ServerPeerActivate: Called after a client has activated
  • ServerChannelsInit: Called after channels are initialized
  • ServerChannelsFree: Called after channels are cleaned up
  • ServerSessionEnd: Called after the client connection disconnected

Currently supported filter events

  • KeyboardEvent: Keyboard event, e.g. all key press and release events
  • MouseEvent: Mouse event, e.g. mouse movement and button press/release events
  • ClientChannelData: Client static channel data
  • ServerChannelData: Server static channel data
  • DynamicChannelCreate: Dynamic channel create
  • ServerFetchTargetAddr: Fetch target address (e.g. RDP TargetInfo)
  • ServerPeerLogon: A peer is logging on

Developing a new module

  • Create a new file that includes freerdp/server/proxy/proxy_modules_api.h.
  • Implement the proxy_module_entry_point function and register the callbacks you are interested in.
  • Each callback receives two parameters:
    • connectionInfo* info holds connection info of the raised event.
    • void* param holds the actual event data. It should be casted by the filter to the suitable struct from filters_api.h.
  • Each callback must return a BOOL:
    • FALSE: The event will not be proxied.
    • TRUE: The event will be proxied.

A demo can be found in filter_demo.c.