FreeRDP
Loading...
Searching...
No Matches
proxy_context.h
1
22#ifndef FREERDP_SERVER_PROXY_PFCONTEXT_H
23#define FREERDP_SERVER_PROXY_PFCONTEXT_H
24
25#include <freerdp/api.h>
26#include <freerdp/types.h>
27
28#include <freerdp/freerdp.h>
29#include <freerdp/channels/wtsvc.h>
30
31#include <freerdp/server/proxy/proxy_config.h>
32#include <freerdp/server/proxy/proxy_types.h>
33
34#define PROXY_SESSION_ID_LENGTH 32
35
36#ifdef __cplusplus
37extern "C"
38{
39#endif
40
41 typedef struct proxy_data proxyData;
42 typedef struct proxy_module proxyModule;
43 typedef struct p_server_static_channel_context pServerStaticChannelContext;
44
45 typedef struct s_InterceptContextMapEntry
46 {
47 void (*free)(struct s_InterceptContextMapEntry*);
49
50 /* All proxy interception channels derive from this base struct
51 * and set their cleanup function accordingly. */
52 FREERDP_API void intercept_context_entry_free(void* obj);
53
54 typedef PfChannelResult (*proxyChannelDataFn)(proxyData* pdata,
55 const pServerStaticChannelContext* channel,
56 const BYTE* xdata, size_t xsize, UINT32 flags,
57 size_t totalSizepServer);
58 typedef void (*proxyChannelContextDtor)(void* context);
59
62 {
63 char* channel_name;
64 UINT32 front_channel_id;
65 UINT32 back_channel_id;
66 pf_utils_channel_mode channelMode;
67 WINPR_ATTR_NODISCARD proxyChannelDataFn onFrontData;
68 WINPR_ATTR_NODISCARD proxyChannelDataFn onBackData;
69 proxyChannelContextDtor contextDtor;
70 void* context;
71 };
72
73 FREERDP_API void StaticChannelContext_free(pServerStaticChannelContext* ctx);
74
79 {
80 rdpContext context;
81
82 proxyData* pdata;
83
84 HANDLE vcm;
85 HANDLE dynvcReady;
86
87 wHashTable* interceptContextMap;
88 wHashTable* channelsByFrontId;
89 wHashTable* channelsByBackId;
90 };
91 typedef struct p_server_context pServerContext;
92
93 WINPR_ATTR_MALLOC(StaticChannelContext_free, 1)
94 WINPR_ATTR_NODISCARD
95 pServerStaticChannelContext* StaticChannelContext_new(pServerContext* ps, const char* name,
96 UINT32 id);
97
101 typedef struct p_client_context pClientContext;
102
104 {
105 rdpContext context;
106
107 proxyData* pdata;
108
109 /*
110 * In a case when freerdp_connect fails,
111 * Used for NLA fallback feature, to check if the server should close the connection.
112 * When it is set to TRUE, proxy's client knows it shouldn't signal the server thread to
113 * closed the connection when pf_client_post_disconnect is called, because it is trying to
114 * connect reconnect without NLA. It must be set to TRUE before the first try, and to FALSE
115 * after the connection fully established, to ensure graceful shutdown of the connection
116 * when it will be closed.
117 */
118 BOOL allow_next_conn_failure;
119
120 BOOL connected; /* Set after client post_connect. */
121
122 pReceiveChannelData client_receive_channel_data_original;
123 wQueue* cached_server_channel_data;
124 WINPR_ATTR_NODISCARD BOOL (*sendChannelData)(pClientContext* pc,
125 const proxyChannelDataEventInfo* ev);
126
127 /* X509 specific */
128 char* remote_hostname;
129 wStream* remote_pem;
130 UINT16 remote_port;
131 UINT32 remote_flags;
132
133 BOOL input_state_sync_pending;
134 UINT32 input_state;
135
136 wHashTable* interceptContextMap;
137 UINT32 computerNameLen;
138 BOOL computerNameUnicode;
139 union
140 {
141 WCHAR* wc;
142 char* c;
143 void* v;
144 } computerName;
145 };
146
151 {
152 proxyModule* module;
153 const proxyConfig* config;
154
155 pServerContext* ps;
156 pClientContext* pc;
157
158 HANDLE abort_event;
159 HANDLE client_thread;
160 HANDLE gfx_server_ready;
161
162 char session_id[PROXY_SESSION_ID_LENGTH + 1];
163
164 /* used to external modules to store per-session info */
165 wHashTable* modules_info;
166 psPeerReceiveChannelData server_receive_channel_data_original;
167 };
168
169 WINPR_ATTR_NODISCARD
170 FREERDP_API BOOL pf_context_copy_settings(rdpSettings* dst, const rdpSettings* src);
171
172 WINPR_ATTR_NODISCARD
173 FREERDP_API BOOL pf_context_init_server_context(freerdp_peer* client);
174
175 WINPR_ATTR_MALLOC(freerdp_client_context_free, 1)
176 WINPR_ATTR_NODISCARD
177 FREERDP_API pClientContext* pf_context_create_client_context(const rdpSettings* clientSettings);
178
179 FREERDP_API void proxy_data_free(proxyData* pdata);
180
181 WINPR_ATTR_MALLOC(proxy_data_free, 1)
182 WINPR_ATTR_NODISCARD
183 FREERDP_API proxyData* proxy_data_new(void);
184 FREERDP_API void proxy_data_set_client_context(proxyData* pdata, pClientContext* context);
185 FREERDP_API void proxy_data_set_server_context(proxyData* pdata, pServerContext* context);
186
187 WINPR_ATTR_NODISCARD
188 FREERDP_API BOOL proxy_data_shall_disconnect(proxyData* pdata);
189 FREERDP_API void proxy_data_abort_connect(proxyData* pdata);
190
191#ifdef __cplusplus
192}
193#endif
194
195#endif /* FREERDP_SERVER_PROXY_PFCONTEXT_H */
per channel configuration