/src/FreeRDP/libfreerdp/core/settings.c
Line | Count | Source (jump to first uncovered line) |
1 | | /** |
2 | | * FreeRDP: A Remote Desktop Protocol Implementation |
3 | | * RDP Settings |
4 | | * |
5 | | * Copyright 2009-2011 Jay Sorg |
6 | | * Copyright 2023 Armin Novak <anovak@thincast.com> |
7 | | * Copyright 2023 Thincast Technologies GmbH |
8 | | * |
9 | | * Licensed under the Apache License, Version 2.0 (the "License"); |
10 | | * you may not use this file except in compliance with the License. |
11 | | * You may obtain a copy of the License at |
12 | | * |
13 | | * http://www.apache.org/licenses/LICENSE-2.0 |
14 | | * |
15 | | * Unless required by applicable law or agreed to in writing, software |
16 | | * distributed under the License is distributed on an "AS IS" BASIS, |
17 | | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
18 | | * See the License for the specific language governing permissions and |
19 | | * limitations under the License. |
20 | | */ |
21 | | |
22 | | #include <freerdp/config.h> |
23 | | |
24 | | #include "settings.h" |
25 | | |
26 | | #include <freerdp/crypto/certificate.h> |
27 | | |
28 | | #include <ctype.h> |
29 | | |
30 | | #include <winpr/crt.h> |
31 | | #include <winpr/file.h> |
32 | | #include <winpr/path.h> |
33 | | #include <winpr/sysinfo.h> |
34 | | #include <winpr/registry.h> |
35 | | #include <winpr/wtsapi.h> |
36 | | |
37 | | #include <freerdp/settings.h> |
38 | | #include <freerdp/build-config.h> |
39 | | |
40 | | #include "../crypto/certificate.h" |
41 | | #include "../crypto/privatekey.h" |
42 | | #include "capabilities.h" |
43 | | |
44 | | #define TAG FREERDP_TAG("settings") |
45 | | |
46 | | #ifdef _MSC_VER |
47 | | #pragma warning(push) |
48 | | #pragma warning(disable : 4244) |
49 | | #endif |
50 | | |
51 | | static const char client_dll[] = "C:\\Windows\\System32\\mstscax.dll"; |
52 | | |
53 | 14.9k | #define SERVER_KEY "Software\\" FREERDP_VENDOR_STRING "\\" FREERDP_PRODUCT_STRING "\\Server" |
54 | 179k | #define CLIENT_KEY "Software\\" FREERDP_VENDOR_STRING "\\" FREERDP_PRODUCT_STRING "\\Client" |
55 | 44.9k | #define BITMAP_CACHE_KEY CLIENT_KEY "\\BitmapCacheV2" |
56 | 44.9k | #define GLYPH_CACHE_KEY CLIENT_KEY "\\GlyphCache" |
57 | 44.9k | #define POINTER_CACHE_KEY CLIENT_KEY "\\PointerCache" |
58 | | |
59 | | static BOOL settings_reg_query_dword_val(HKEY hKey, const TCHAR* sub, DWORD* value) |
60 | 0 | { |
61 | 0 | DWORD dwType = 0; |
62 | 0 | DWORD dwSize = 0; |
63 | |
|
64 | 0 | dwSize = sizeof(DWORD); |
65 | 0 | if (RegQueryValueEx(hKey, sub, NULL, &dwType, (BYTE*)value, &dwSize) != ERROR_SUCCESS) |
66 | 0 | return FALSE; |
67 | 0 | if (dwType != REG_DWORD) |
68 | 0 | return FALSE; |
69 | | |
70 | 0 | return TRUE; |
71 | 0 | } |
72 | | |
73 | | static BOOL settings_reg_query_word_val(HKEY hKey, const TCHAR* sub, UINT16* value) |
74 | 0 | { |
75 | 0 | DWORD dwValue = 0; |
76 | |
|
77 | 0 | if (!settings_reg_query_dword_val(hKey, sub, &dwValue)) |
78 | 0 | return FALSE; |
79 | | |
80 | 0 | if (dwValue > UINT16_MAX) |
81 | 0 | return FALSE; |
82 | | |
83 | 0 | *value = (UINT16)dwValue; |
84 | 0 | return TRUE; |
85 | 0 | } |
86 | | |
87 | | static BOOL settings_reg_query_bool_val(HKEY hKey, const TCHAR* sub, BOOL* value) |
88 | 0 | { |
89 | 0 | DWORD dwValue = 0; |
90 | |
|
91 | 0 | if (!settings_reg_query_dword_val(hKey, sub, &dwValue)) |
92 | 0 | return FALSE; |
93 | 0 | *value = dwValue != 0; |
94 | 0 | return TRUE; |
95 | 0 | } |
96 | | |
97 | | static BOOL settings_reg_query_dword(rdpSettings* settings, FreeRDP_Settings_Keys_UInt32 id, |
98 | | HKEY hKey, const TCHAR* sub) |
99 | 0 | { |
100 | 0 | DWORD dwValue = 0; |
101 | |
|
102 | 0 | if (!settings_reg_query_dword_val(hKey, sub, &dwValue)) |
103 | 0 | return FALSE; |
104 | | |
105 | 0 | return freerdp_settings_set_uint32(settings, id, dwValue); |
106 | 0 | } |
107 | | |
108 | | static BOOL settings_reg_query_bool(rdpSettings* settings, FreeRDP_Settings_Keys_Bool id, HKEY hKey, |
109 | | const TCHAR* sub) |
110 | 0 | { |
111 | 0 | DWORD dwValue = 0; |
112 | |
|
113 | 0 | if (!settings_reg_query_dword_val(hKey, sub, &dwValue)) |
114 | 0 | return FALSE; |
115 | | |
116 | 0 | return freerdp_settings_set_bool(settings, id, dwValue != 0 ? TRUE : FALSE); |
117 | 0 | } |
118 | | |
119 | | static void settings_client_load_hkey_local_machine(rdpSettings* settings) |
120 | 44.9k | { |
121 | 44.9k | HKEY hKey = NULL; |
122 | 44.9k | LONG status = 0; |
123 | 44.9k | status = RegOpenKeyExA(HKEY_LOCAL_MACHINE, CLIENT_KEY, 0, KEY_READ | KEY_WOW64_64KEY, &hKey); |
124 | | |
125 | 44.9k | if (status == ERROR_SUCCESS) |
126 | 0 | { |
127 | 0 | settings_reg_query_dword(settings, FreeRDP_DesktopWidth, hKey, _T("DesktopWidth")); |
128 | 0 | settings_reg_query_dword(settings, FreeRDP_DesktopHeight, hKey, _T("DesktopHeight")); |
129 | 0 | settings_reg_query_bool(settings, FreeRDP_Fullscreen, hKey, _T("Fullscreen")); |
130 | 0 | settings_reg_query_dword(settings, FreeRDP_ColorDepth, hKey, _T("ColorDepth")); |
131 | 0 | settings_reg_query_dword(settings, FreeRDP_KeyboardType, hKey, _T("KeyboardType")); |
132 | 0 | settings_reg_query_dword(settings, FreeRDP_KeyboardSubType, hKey, _T("KeyboardSubType")); |
133 | 0 | settings_reg_query_dword(settings, FreeRDP_KeyboardFunctionKey, hKey, |
134 | 0 | _T("KeyboardFunctionKeys")); |
135 | 0 | settings_reg_query_dword(settings, FreeRDP_KeyboardLayout, hKey, _T("KeyboardLayout")); |
136 | 0 | settings_reg_query_bool(settings, FreeRDP_ExtSecurity, hKey, _T("ExtSecurity")); |
137 | 0 | settings_reg_query_bool(settings, FreeRDP_NlaSecurity, hKey, _T("NlaSecurity")); |
138 | 0 | settings_reg_query_bool(settings, FreeRDP_TlsSecurity, hKey, _T("TlsSecurity")); |
139 | 0 | settings_reg_query_bool(settings, FreeRDP_RdpSecurity, hKey, _T("RdpSecurity")); |
140 | 0 | settings_reg_query_bool(settings, FreeRDP_MstscCookieMode, hKey, _T("MstscCookieMode")); |
141 | 0 | settings_reg_query_dword(settings, FreeRDP_CookieMaxLength, hKey, _T("CookieMaxLength")); |
142 | 0 | settings_reg_query_bool(settings, FreeRDP_BitmapCacheEnabled, hKey, _T("BitmapCache")); |
143 | 0 | settings_reg_query_dword(settings, FreeRDP_OffscreenSupportLevel, hKey, |
144 | 0 | _T("OffscreenBitmapCache")); |
145 | 0 | settings_reg_query_dword(settings, FreeRDP_OffscreenCacheSize, hKey, |
146 | 0 | _T("OffscreenBitmapCacheSize")); |
147 | 0 | settings_reg_query_dword(settings, FreeRDP_OffscreenCacheEntries, hKey, |
148 | 0 | _T("OffscreenBitmapCacheEntries")); |
149 | 0 | RegCloseKey(hKey); |
150 | 0 | } |
151 | | |
152 | 44.9k | status = |
153 | 44.9k | RegOpenKeyExA(HKEY_LOCAL_MACHINE, BITMAP_CACHE_KEY, 0, KEY_READ | KEY_WOW64_64KEY, &hKey); |
154 | | |
155 | 44.9k | if (status == ERROR_SUCCESS) |
156 | 0 | { |
157 | 0 | settings_reg_query_dword(settings, FreeRDP_BitmapCacheV2NumCells, hKey, _T("NumCells")); |
158 | 0 | for (unsigned x = 0; x < 5; x++) |
159 | 0 | { |
160 | 0 | DWORD val = 0; |
161 | 0 | TCHAR numentries[64] = { 0 }; |
162 | 0 | TCHAR persist[64] = { 0 }; |
163 | 0 | BITMAP_CACHE_V2_CELL_INFO cache = { 0 }; |
164 | 0 | _sntprintf(numentries, ARRAYSIZE(numentries), _T("Cell%uNumEntries"), x); |
165 | 0 | _sntprintf(persist, ARRAYSIZE(persist), _T("Cell%uPersistent"), x); |
166 | 0 | if (!settings_reg_query_dword_val(hKey, numentries, &val) || |
167 | 0 | !settings_reg_query_bool_val(hKey, persist, &cache.persistent) || |
168 | 0 | !freerdp_settings_set_pointer_array(settings, FreeRDP_BitmapCacheV2CellInfo, x, |
169 | 0 | &cache)) |
170 | 0 | WLog_WARN(TAG, "Failed to load registry keys to settings!"); |
171 | 0 | cache.numEntries = val; |
172 | 0 | } |
173 | |
|
174 | 0 | settings_reg_query_bool(settings, FreeRDP_AllowCacheWaitingList, hKey, |
175 | 0 | _T("AllowCacheWaitingList")); |
176 | 0 | RegCloseKey(hKey); |
177 | 0 | } |
178 | | |
179 | 44.9k | status = |
180 | 44.9k | RegOpenKeyExA(HKEY_LOCAL_MACHINE, GLYPH_CACHE_KEY, 0, KEY_READ | KEY_WOW64_64KEY, &hKey); |
181 | | |
182 | 44.9k | if (status == ERROR_SUCCESS) |
183 | 0 | { |
184 | 0 | unsigned x = 0; |
185 | 0 | UINT32 GlyphSupportLevel = 0; |
186 | 0 | settings_reg_query_dword(settings, FreeRDP_GlyphSupportLevel, hKey, _T("SupportLevel")); |
187 | 0 | for (; x < 10; x++) |
188 | 0 | { |
189 | 0 | GLYPH_CACHE_DEFINITION cache = { 0 }; |
190 | 0 | TCHAR numentries[64] = { 0 }; |
191 | 0 | TCHAR maxsize[64] = { 0 }; |
192 | 0 | _sntprintf(numentries, ARRAYSIZE(numentries), _T("Cache%uNumEntries"), x); |
193 | 0 | _sntprintf(maxsize, ARRAYSIZE(maxsize), _T("Cache%uMaxCellSize"), x); |
194 | |
|
195 | 0 | settings_reg_query_word_val(hKey, numentries, &cache.cacheEntries); |
196 | 0 | settings_reg_query_word_val(hKey, maxsize, &cache.cacheMaximumCellSize); |
197 | 0 | if (!freerdp_settings_set_pointer_array(settings, FreeRDP_GlyphCache, x, &cache)) |
198 | 0 | WLog_WARN(TAG, "Failed to store GlyphCache %" PRIuz, x); |
199 | 0 | } |
200 | 0 | { |
201 | 0 | GLYPH_CACHE_DEFINITION cache = { 0 }; |
202 | 0 | settings_reg_query_word_val(hKey, _T("FragCacheNumEntries"), &cache.cacheEntries); |
203 | 0 | settings_reg_query_word_val(hKey, _T("FragCacheMaxCellSize"), |
204 | 0 | &cache.cacheMaximumCellSize); |
205 | 0 | if (!freerdp_settings_set_pointer_array(settings, FreeRDP_FragCache, x, &cache)) |
206 | 0 | WLog_WARN(TAG, "Failed to store FragCache"); |
207 | 0 | } |
208 | |
|
209 | 0 | RegCloseKey(hKey); |
210 | |
|
211 | 0 | if (!freerdp_settings_set_uint32(settings, FreeRDP_GlyphSupportLevel, GlyphSupportLevel)) |
212 | 0 | WLog_WARN(TAG, "Failed to load registry keys to settings!"); |
213 | 0 | } |
214 | | |
215 | 44.9k | status = |
216 | 44.9k | RegOpenKeyExA(HKEY_LOCAL_MACHINE, POINTER_CACHE_KEY, 0, KEY_READ | KEY_WOW64_64KEY, &hKey); |
217 | | |
218 | 44.9k | if (status == ERROR_SUCCESS) |
219 | 0 | { |
220 | 0 | settings_reg_query_dword(settings, FreeRDP_LargePointerFlag, hKey, _T("LargePointer")); |
221 | 0 | settings_reg_query_dword(settings, FreeRDP_PointerCacheSize, hKey, _T("PointerCacheSize")); |
222 | 0 | settings_reg_query_dword(settings, FreeRDP_ColorPointerCacheSize, hKey, |
223 | 0 | _T("ColorPointerCacheSize")); |
224 | 0 | RegCloseKey(hKey); |
225 | 0 | } |
226 | 44.9k | } |
227 | | |
228 | | static void settings_server_load_hkey_local_machine(rdpSettings* settings) |
229 | 14.9k | { |
230 | 14.9k | HKEY hKey = NULL; |
231 | 14.9k | LONG status = 0; |
232 | | |
233 | 14.9k | status = RegOpenKeyExA(HKEY_LOCAL_MACHINE, SERVER_KEY, 0, KEY_READ | KEY_WOW64_64KEY, &hKey); |
234 | | |
235 | 14.9k | if (status != ERROR_SUCCESS) |
236 | 14.9k | return; |
237 | | |
238 | 0 | settings_reg_query_bool(settings, FreeRDP_ExtSecurity, hKey, _T("ExtSecurity")); |
239 | 0 | settings_reg_query_bool(settings, FreeRDP_NlaSecurity, hKey, _T("NlaSecurity")); |
240 | 0 | settings_reg_query_bool(settings, FreeRDP_TlsSecurity, hKey, _T("TlsSecurity")); |
241 | 0 | settings_reg_query_dword(settings, FreeRDP_TlsSecLevel, hKey, _T("TlsSecLevel")); |
242 | 0 | settings_reg_query_bool(settings, FreeRDP_RdpSecurity, hKey, _T("RdpSecurity")); |
243 | |
|
244 | 0 | RegCloseKey(hKey); |
245 | 0 | } |
246 | | |
247 | | static void settings_load_hkey_local_machine(rdpSettings* settings) |
248 | 59.9k | { |
249 | 59.9k | if (freerdp_settings_get_bool(settings, FreeRDP_ServerMode)) |
250 | 14.9k | settings_server_load_hkey_local_machine(settings); |
251 | 44.9k | else |
252 | 44.9k | settings_client_load_hkey_local_machine(settings); |
253 | 59.9k | } |
254 | | |
255 | | static BOOL settings_get_computer_name(rdpSettings* settings) |
256 | 59.9k | { |
257 | 59.9k | CHAR computerName[256] = { 0 }; |
258 | 59.9k | DWORD nSize = sizeof(computerName); |
259 | | |
260 | 59.9k | if (!GetComputerNameExA(ComputerNameNetBIOS, computerName, &nSize)) |
261 | 0 | return FALSE; |
262 | | |
263 | 59.9k | if (nSize > MAX_COMPUTERNAME_LENGTH) |
264 | 0 | computerName[MAX_COMPUTERNAME_LENGTH] = '\0'; |
265 | | |
266 | 59.9k | return freerdp_settings_set_string(settings, FreeRDP_ComputerName, computerName); |
267 | 59.9k | } |
268 | | |
269 | | void freerdp_settings_print_warnings(const rdpSettings* settings) |
270 | 0 | { |
271 | 0 | const UINT32 level = freerdp_settings_get_uint32(settings, FreeRDP_GlyphSupportLevel); |
272 | 0 | if (level != GLYPH_SUPPORT_NONE) |
273 | 0 | { |
274 | 0 | char buffer[32] = { 0 }; |
275 | 0 | WLog_WARN(TAG, "[experimental] enabled GlyphSupportLevel %s, expect visual artefacts!", |
276 | 0 | freerdp_settings_glyph_level_string(level, buffer, sizeof(buffer))); |
277 | 0 | } |
278 | 0 | } |
279 | | |
280 | | BOOL freerdp_settings_set_default_order_support(rdpSettings* settings) |
281 | 59.9k | { |
282 | 59.9k | BYTE* OrderSupport = freerdp_settings_get_pointer_writable(settings, FreeRDP_OrderSupport); |
283 | 59.9k | if (!OrderSupport) |
284 | 0 | return FALSE; |
285 | | |
286 | 59.9k | ZeroMemory(OrderSupport, 32); |
287 | 59.9k | OrderSupport[NEG_DSTBLT_INDEX] = TRUE; |
288 | 59.9k | OrderSupport[NEG_PATBLT_INDEX] = TRUE; |
289 | 59.9k | OrderSupport[NEG_SCRBLT_INDEX] = TRUE; |
290 | 59.9k | OrderSupport[NEG_OPAQUE_RECT_INDEX] = TRUE; |
291 | 59.9k | OrderSupport[NEG_DRAWNINEGRID_INDEX] = FALSE; |
292 | 59.9k | OrderSupport[NEG_MULTIDSTBLT_INDEX] = FALSE; |
293 | 59.9k | OrderSupport[NEG_MULTIPATBLT_INDEX] = FALSE; |
294 | 59.9k | OrderSupport[NEG_MULTISCRBLT_INDEX] = FALSE; |
295 | 59.9k | OrderSupport[NEG_MULTIOPAQUERECT_INDEX] = TRUE; |
296 | 59.9k | OrderSupport[NEG_MULTI_DRAWNINEGRID_INDEX] = FALSE; |
297 | 59.9k | OrderSupport[NEG_LINETO_INDEX] = TRUE; |
298 | 59.9k | OrderSupport[NEG_POLYLINE_INDEX] = TRUE; |
299 | 59.9k | OrderSupport[NEG_MEMBLT_INDEX] = |
300 | 59.9k | freerdp_settings_get_bool(settings, FreeRDP_BitmapCacheEnabled) ? 1 : 0; |
301 | 59.9k | OrderSupport[NEG_MEM3BLT_INDEX] = |
302 | 59.9k | freerdp_settings_get_bool(settings, FreeRDP_BitmapCacheEnabled) ? 1 : 0; |
303 | 59.9k | OrderSupport[NEG_MEMBLT_V2_INDEX] = |
304 | 59.9k | freerdp_settings_get_bool(settings, FreeRDP_BitmapCacheEnabled) ? 1 : 0; |
305 | 59.9k | OrderSupport[NEG_MEM3BLT_V2_INDEX] = |
306 | 59.9k | freerdp_settings_get_bool(settings, FreeRDP_BitmapCacheEnabled) ? 1 : 0; |
307 | 59.9k | OrderSupport[NEG_SAVEBITMAP_INDEX] = FALSE; |
308 | 59.9k | OrderSupport[NEG_GLYPH_INDEX_INDEX] = |
309 | 59.9k | freerdp_settings_get_uint32(settings, FreeRDP_GlyphSupportLevel) != GLYPH_SUPPORT_NONE; |
310 | 59.9k | OrderSupport[NEG_FAST_INDEX_INDEX] = |
311 | 59.9k | freerdp_settings_get_uint32(settings, FreeRDP_GlyphSupportLevel) != GLYPH_SUPPORT_NONE; |
312 | 59.9k | OrderSupport[NEG_FAST_GLYPH_INDEX] = |
313 | 59.9k | freerdp_settings_get_uint32(settings, FreeRDP_GlyphSupportLevel) != GLYPH_SUPPORT_NONE; |
314 | 59.9k | OrderSupport[NEG_POLYGON_SC_INDEX] = FALSE; |
315 | 59.9k | OrderSupport[NEG_POLYGON_CB_INDEX] = FALSE; |
316 | 59.9k | OrderSupport[NEG_ELLIPSE_SC_INDEX] = FALSE; |
317 | 59.9k | OrderSupport[NEG_ELLIPSE_CB_INDEX] = FALSE; |
318 | 59.9k | return TRUE; |
319 | 59.9k | } |
320 | | |
321 | | BOOL freerdp_capability_buffer_allocate(rdpSettings* settings, UINT32 count) |
322 | 79.7k | { |
323 | 79.7k | WINPR_ASSERT(settings); |
324 | 79.7k | WINPR_ASSERT(count > 0); |
325 | 79.7k | WINPR_ASSERT(count == 32); |
326 | | |
327 | 79.7k | freerdp_capability_buffer_free(settings); |
328 | 79.7k | WINPR_ASSERT(settings->ReceivedCapabilitiesSize == 0); |
329 | | |
330 | 79.7k | settings->ReceivedCapabilitiesSize = count; |
331 | 79.7k | void* tmp = realloc(settings->ReceivedCapabilities, count * sizeof(BYTE)); |
332 | 79.7k | if (!tmp) |
333 | 0 | return FALSE; |
334 | 79.7k | memset(tmp, 0, count * sizeof(BYTE)); |
335 | 79.7k | settings->ReceivedCapabilities = tmp; |
336 | | |
337 | 79.7k | tmp = realloc(settings->ReceivedCapabilityData, count * sizeof(BYTE*)); |
338 | 79.7k | if (!tmp) |
339 | 0 | return FALSE; |
340 | 79.7k | memset(tmp, 0, count * sizeof(BYTE*)); |
341 | 79.7k | settings->ReceivedCapabilityData = tmp; |
342 | | |
343 | 79.7k | tmp = realloc(settings->ReceivedCapabilityDataSizes, count * sizeof(UINT32)); |
344 | 79.7k | if (!tmp) |
345 | 0 | return FALSE; |
346 | 79.7k | memset(tmp, 0, count * sizeof(UINT32)); |
347 | 79.7k | settings->ReceivedCapabilityDataSizes = tmp; |
348 | | |
349 | 79.7k | return (settings->ReceivedCapabilities && settings->ReceivedCapabilityData && |
350 | 79.7k | settings->ReceivedCapabilityDataSizes); |
351 | 79.7k | } |
352 | | |
353 | | rdpSettings* freerdp_settings_new(DWORD flags) |
354 | 59.9k | { |
355 | 59.9k | char* base = NULL; |
356 | 59.9k | char* issuers[] = { "FreeRDP", "FreeRDP-licenser" }; |
357 | 59.9k | const BOOL server = (flags & FREERDP_SETTINGS_SERVER_MODE) != 0 ? TRUE : FALSE; |
358 | 59.9k | const BOOL remote = (flags & FREERDP_SETTINGS_REMOTE_MODE) != 0 ? TRUE : FALSE; |
359 | 59.9k | rdpSettings* settings = (rdpSettings*)calloc(1, sizeof(rdpSettings)); |
360 | | |
361 | 59.9k | if (!settings) |
362 | 0 | return NULL; |
363 | | |
364 | 59.9k | if (!freerdp_settings_set_uint16(settings, FreeRDP_CapsProtocolVersion, |
365 | 59.9k | TS_CAPS_PROTOCOLVERSION)) |
366 | 0 | goto out_fail; |
367 | | |
368 | 59.9k | if (!freerdp_settings_set_uint32(settings, FreeRDP_ClipboardFeatureMask, |
369 | 59.9k | CLIPRDR_FLAG_DEFAULT_MASK)) |
370 | 0 | goto out_fail; |
371 | 59.9k | if (!freerdp_settings_set_string(settings, FreeRDP_ServerLicenseCompanyName, "FreeRDP")) |
372 | 0 | goto out_fail; |
373 | 59.9k | if (!freerdp_settings_set_string(settings, FreeRDP_ServerLicenseProductName, |
374 | 59.9k | "FreeRDP-licensing-server")) |
375 | 0 | goto out_fail; |
376 | 59.9k | if (!freerdp_settings_set_uint32(settings, FreeRDP_ServerLicenseProductVersion, 1)) |
377 | 0 | goto out_fail; |
378 | 59.9k | if (!freerdp_server_license_issuers_copy(settings, issuers, ARRAYSIZE(issuers))) |
379 | 0 | goto out_fail; |
380 | | |
381 | 59.9k | if (!freerdp_settings_set_uint16(settings, FreeRDP_SupportedColorDepths, |
382 | 59.9k | RNS_UD_32BPP_SUPPORT | RNS_UD_24BPP_SUPPORT | |
383 | 59.9k | RNS_UD_16BPP_SUPPORT | RNS_UD_15BPP_SUPPORT)) |
384 | 0 | goto out_fail; |
385 | | |
386 | 59.9k | if (!freerdp_settings_set_bool(settings, FreeRDP_UnicodeInput, TRUE) || |
387 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_HasHorizontalWheel, TRUE) || |
388 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_HasExtendedMouseEvent, TRUE) || |
389 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_HasQoeEvent, TRUE) || |
390 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_HasRelativeMouseEvent, TRUE) || |
391 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_HiDefRemoteApp, TRUE) || |
392 | 59.9k | !freerdp_settings_set_uint32( |
393 | 59.9k | settings, FreeRDP_RemoteApplicationSupportMask, |
394 | 59.9k | RAIL_LEVEL_SUPPORTED | RAIL_LEVEL_DOCKED_LANGBAR_SUPPORTED | |
395 | 59.9k | RAIL_LEVEL_SHELL_INTEGRATION_SUPPORTED | RAIL_LEVEL_LANGUAGE_IME_SYNC_SUPPORTED | |
396 | 59.9k | RAIL_LEVEL_SERVER_TO_CLIENT_IME_SYNC_SUPPORTED | |
397 | 59.9k | RAIL_LEVEL_HIDE_MINIMIZED_APPS_SUPPORTED | RAIL_LEVEL_WINDOW_CLOAKING_SUPPORTED | |
398 | 59.9k | RAIL_LEVEL_HANDSHAKE_EX_SUPPORTED) || |
399 | 59.9k | !freerdp_settings_set_uint16(settings, FreeRDP_TextANSICodePage, CP_UTF8) || |
400 | 59.9k | !freerdp_settings_set_uint16(settings, FreeRDP_OrderSupportFlags, |
401 | 59.9k | NEGOTIATE_ORDER_SUPPORT | ZERO_BOUNDS_DELTA_SUPPORT | |
402 | 59.9k | COLOR_INDEX_SUPPORT) || |
403 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_SupportHeartbeatPdu, TRUE) || |
404 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_ServerMode, server) || |
405 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_WaitForOutputBufferFlush, TRUE) || |
406 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_ClusterInfoFlags, REDIRECTION_SUPPORTED) || |
407 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_DesktopWidth, 1024) || |
408 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_DesktopHeight, 768) || |
409 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_Workarea, FALSE) || |
410 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_Fullscreen, FALSE) || |
411 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_GrabKeyboard, TRUE) || |
412 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_Decorations, TRUE) || |
413 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_RdpVersion, RDP_VERSION_10_12) || |
414 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_ColorDepth, 32) || |
415 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_AadSecurity, FALSE) || |
416 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_ExtSecurity, FALSE) || |
417 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_NlaSecurity, TRUE) || |
418 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_TlsSecurity, TRUE) || |
419 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_RdpSecurity, TRUE) || |
420 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_RdstlsSecurity, FALSE) || |
421 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_NegotiateSecurityLayer, TRUE) || |
422 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_RestrictedAdminModeRequired, FALSE) || |
423 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_MstscCookieMode, FALSE) || |
424 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_CookieMaxLength, |
425 | 59.9k | DEFAULT_COOKIE_MAX_LENGTH) || |
426 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_ClientBuild, |
427 | 59.9k | 18363) || /* Windows 10, Version 1909 */ |
428 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_KeyboardType, 4) || |
429 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_KeyboardSubType, 0) || |
430 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_KeyboardFunctionKey, 12) || |
431 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_KeyboardLayout, 0) || |
432 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_KeyboardHook, |
433 | 59.9k | KEYBOARD_HOOK_FULLSCREEN_ONLY) || |
434 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_UseRdpSecurityLayer, FALSE) || |
435 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_SaltedChecksum, TRUE) || |
436 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_ServerPort, 3389) || |
437 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_GatewayPort, 443) || |
438 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_DesktopResize, TRUE) || |
439 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_ToggleFullscreen, TRUE) || |
440 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_DesktopPosX, UINT32_MAX) || |
441 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_DesktopPosY, UINT32_MAX) || |
442 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_SoftwareGdi, TRUE) || |
443 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_UnmapButtons, FALSE) || |
444 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_PerformanceFlags, PERF_FLAG_NONE) || |
445 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_AllowFontSmoothing, TRUE) || |
446 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_AllowDesktopComposition, FALSE) || |
447 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_DisableWallpaper, FALSE) || |
448 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_DisableFullWindowDrag, TRUE) || |
449 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_DisableMenuAnims, TRUE) || |
450 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_DisableThemes, FALSE) || |
451 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_ConnectionType, |
452 | 59.9k | CONNECTION_TYPE_AUTODETECT) || |
453 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_NetworkAutoDetect, TRUE) || |
454 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_EncryptionMethods, ENCRYPTION_METHOD_NONE) || |
455 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_EncryptionLevel, ENCRYPTION_LEVEL_NONE) || |
456 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_FIPSMode, FALSE) || |
457 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_CompressionEnabled, TRUE) || |
458 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_LogonNotify, TRUE) || |
459 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_BrushSupportLevel, BRUSH_COLOR_FULL) || |
460 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_CompressionLevel, PACKET_COMPR_TYPE_RDP61) || |
461 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_Authentication, TRUE) || |
462 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_AuthenticationOnly, FALSE) || |
463 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_CredentialsFromStdin, FALSE) || |
464 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_DisableCredentialsDelegation, FALSE) || |
465 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_AuthenticationLevel, 2) || |
466 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_ChannelCount, 0) || |
467 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_CertificateCallbackPreferPEM, FALSE) || |
468 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_KeySpec, AT_KEYEXCHANGE)) |
469 | 0 | goto out_fail; |
470 | | |
471 | 59.9k | if (!freerdp_settings_set_pointer_len(settings, FreeRDP_ChannelDefArray, NULL, |
472 | 59.9k | CHANNEL_MAX_COUNT)) |
473 | 0 | goto out_fail; |
474 | | |
475 | 59.9k | if (!freerdp_settings_set_bool(settings, FreeRDP_SupportMonitorLayoutPdu, FALSE)) |
476 | 0 | goto out_fail; |
477 | | |
478 | 59.9k | if (!freerdp_settings_set_uint32(settings, FreeRDP_MonitorCount, 0)) |
479 | 0 | goto out_fail; |
480 | | |
481 | 59.9k | if (!freerdp_settings_set_pointer_len(settings, FreeRDP_MonitorDefArray, NULL, 32)) |
482 | 0 | goto out_fail; |
483 | | |
484 | 59.9k | if (!freerdp_settings_set_uint32(settings, FreeRDP_MonitorLocalShiftX, 0)) |
485 | 0 | goto out_fail; |
486 | | |
487 | 59.9k | if (!freerdp_settings_set_uint32(settings, FreeRDP_MonitorLocalShiftY, 0)) |
488 | 0 | goto out_fail; |
489 | | |
490 | 59.9k | if (!freerdp_settings_set_pointer_len(settings, FreeRDP_MonitorIds, NULL, 0)) |
491 | 0 | goto out_fail; |
492 | | |
493 | 59.9k | if (!freerdp_settings_set_uint32(settings, FreeRDP_MultitransportFlags, |
494 | 59.9k | TRANSPORT_TYPE_UDP_FECR)) |
495 | 0 | goto out_fail; |
496 | 59.9k | if (!freerdp_settings_set_bool(settings, FreeRDP_SupportMultitransport, TRUE)) |
497 | 0 | goto out_fail; |
498 | | |
499 | 59.9k | if (!settings_get_computer_name(settings)) |
500 | 0 | goto out_fail; |
501 | | |
502 | 59.9k | if (!freerdp_settings_set_pointer_len(settings, FreeRDP_RdpServerCertificate, NULL, 1)) |
503 | 0 | goto out_fail; |
504 | | |
505 | 59.9k | if (!freerdp_capability_buffer_allocate(settings, 32)) |
506 | 0 | goto out_fail; |
507 | | |
508 | 59.9k | { |
509 | 59.9k | char tmp[32] = { 0 }; |
510 | 59.9k | if (!freerdp_settings_set_string_len(settings, FreeRDP_ClientProductId, tmp, sizeof(tmp))) |
511 | 0 | goto out_fail; |
512 | 59.9k | } |
513 | | |
514 | 59.9k | { |
515 | 59.9k | char ClientHostname[33] = { 0 }; |
516 | 59.9k | DWORD size = sizeof(ClientHostname) - 2; |
517 | 59.9k | GetComputerNameA(ClientHostname, &size); |
518 | 59.9k | if (!freerdp_settings_set_string(settings, FreeRDP_ClientHostname, ClientHostname)) |
519 | 0 | goto out_fail; |
520 | 59.9k | } |
521 | | |
522 | | /* [MS-RDPBCGR] 2.2.7.1.5 Pointer Capability Set (TS_POINTER_CAPABILITYSET) |
523 | | * |
524 | | * if we are in server mode send a reasonable large cache size, |
525 | | * if we are in client mode just set the value to the maximum we want to |
526 | | * support and during capability exchange that size will be limited to the |
527 | | * sizes the server supports |
528 | | * |
529 | | * We have chosen 128 cursors in cache which is at worst 128 * 576kB (384x384 pixel cursor with |
530 | | * 32bit color depth) |
531 | | * */ |
532 | 59.9k | if (freerdp_settings_get_bool(settings, FreeRDP_ServerMode)) |
533 | 14.9k | { |
534 | 14.9k | if (!freerdp_settings_set_uint32(settings, FreeRDP_PointerCacheSize, 25) || |
535 | 14.9k | !freerdp_settings_set_uint32(settings, FreeRDP_ColorPointerCacheSize, 25)) |
536 | 0 | goto out_fail; |
537 | 14.9k | } |
538 | 44.9k | else |
539 | 44.9k | { |
540 | 44.9k | if (!freerdp_settings_set_uint32(settings, FreeRDP_PointerCacheSize, 128) || |
541 | 44.9k | !freerdp_settings_set_uint32(settings, FreeRDP_ColorPointerCacheSize, 128)) |
542 | 0 | goto out_fail; |
543 | 44.9k | } |
544 | | |
545 | 59.9k | if (!freerdp_settings_set_uint32(settings, FreeRDP_LargePointerFlag, |
546 | 59.9k | (LARGE_POINTER_FLAG_96x96 | LARGE_POINTER_FLAG_384x384)) || |
547 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_SoundBeepsEnabled, TRUE) || |
548 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_DrawGdiPlusEnabled, FALSE) || |
549 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_DrawAllowSkipAlpha, TRUE) || |
550 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_DrawAllowColorSubsampling, FALSE) || |
551 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_DrawAllowDynamicColorFidelity, TRUE) || |
552 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_FrameMarkerCommandEnabled, TRUE) || |
553 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_SurfaceFrameMarkerEnabled, TRUE) || |
554 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_AllowCacheWaitingList, TRUE) || |
555 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_BitmapCacheV2NumCells, 5)) |
556 | 0 | goto out_fail; |
557 | 59.9k | settings->BitmapCacheV2CellInfo = |
558 | 59.9k | (BITMAP_CACHE_V2_CELL_INFO*)calloc(6, sizeof(BITMAP_CACHE_V2_CELL_INFO)); |
559 | | |
560 | 59.9k | if (!settings->BitmapCacheV2CellInfo) |
561 | 0 | goto out_fail; |
562 | | |
563 | 59.9k | { |
564 | 59.9k | BITMAP_CACHE_V2_CELL_INFO cache = { 0 }; |
565 | 59.9k | cache.numEntries = 600; |
566 | 59.9k | if (!freerdp_settings_set_pointer_array(settings, FreeRDP_BitmapCacheV2CellInfo, 0, |
567 | 59.9k | &cache) || |
568 | 59.9k | !freerdp_settings_set_pointer_array(settings, FreeRDP_BitmapCacheV2CellInfo, 1, &cache)) |
569 | 0 | goto out_fail; |
570 | 59.9k | cache.numEntries = 2048; |
571 | 59.9k | if (!freerdp_settings_set_pointer_array(settings, FreeRDP_BitmapCacheV2CellInfo, 2, |
572 | 59.9k | &cache) || |
573 | 59.9k | !freerdp_settings_set_pointer_array(settings, FreeRDP_BitmapCacheV2CellInfo, 4, &cache)) |
574 | 0 | goto out_fail; |
575 | 59.9k | cache.numEntries = 4096; |
576 | 59.9k | if (!freerdp_settings_set_pointer_array(settings, FreeRDP_BitmapCacheV2CellInfo, 3, &cache)) |
577 | 0 | goto out_fail; |
578 | 59.9k | } |
579 | 59.9k | if (!freerdp_settings_set_bool(settings, FreeRDP_NoBitmapCompressionHeader, TRUE) || |
580 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_RefreshRect, TRUE) || |
581 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_SuppressOutput, TRUE) || |
582 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_GlyphSupportLevel, GLYPH_SUPPORT_NONE)) |
583 | 0 | goto out_fail; |
584 | 59.9k | settings->GlyphCache = calloc(10, sizeof(GLYPH_CACHE_DEFINITION)); |
585 | | |
586 | 59.9k | if (!settings->GlyphCache) |
587 | 0 | goto out_fail; |
588 | | |
589 | 59.9k | settings->FragCache = calloc(1, sizeof(GLYPH_CACHE_DEFINITION)); |
590 | | |
591 | 59.9k | if (!settings->FragCache) |
592 | 0 | goto out_fail; |
593 | | |
594 | 658k | for (size_t x = 0; x < 10; x++) |
595 | 599k | { |
596 | 599k | GLYPH_CACHE_DEFINITION cache = { 0 }; |
597 | 599k | cache.cacheEntries = 254; |
598 | 599k | switch (x) |
599 | 599k | { |
600 | 59.9k | case 0: |
601 | 119k | case 1: |
602 | 119k | cache.cacheMaximumCellSize = 4; |
603 | 119k | break; |
604 | 59.9k | case 2: |
605 | 119k | case 3: |
606 | 119k | cache.cacheMaximumCellSize = 8; |
607 | 119k | break; |
608 | 59.9k | case 4: |
609 | 59.9k | cache.cacheMaximumCellSize = 16; |
610 | 59.9k | break; |
611 | 59.9k | case 5: |
612 | 59.9k | cache.cacheMaximumCellSize = 32; |
613 | 59.9k | break; |
614 | 59.9k | case 6: |
615 | 59.9k | cache.cacheMaximumCellSize = 64; |
616 | 59.9k | break; |
617 | 59.9k | case 7: |
618 | 59.9k | cache.cacheMaximumCellSize = 128; |
619 | 59.9k | break; |
620 | 59.9k | case 8: |
621 | 59.9k | cache.cacheMaximumCellSize = 256; |
622 | 59.9k | break; |
623 | 59.9k | case 9: |
624 | 59.9k | cache.cacheMaximumCellSize = 256; |
625 | 59.9k | break; |
626 | 599k | } |
627 | | |
628 | 599k | if (!freerdp_settings_set_pointer_array(settings, FreeRDP_GlyphCache, x, &cache)) |
629 | 0 | goto out_fail; |
630 | 599k | } |
631 | 59.9k | { |
632 | 59.9k | GLYPH_CACHE_DEFINITION cache = { 0 }; |
633 | 59.9k | cache.cacheEntries = 256; |
634 | 59.9k | cache.cacheMaximumCellSize = 256; |
635 | 59.9k | if (!freerdp_settings_set_pointer_array(settings, FreeRDP_FragCache, 0, &cache)) |
636 | 0 | goto out_fail; |
637 | 59.9k | } |
638 | 59.9k | if (!freerdp_settings_set_uint32(settings, FreeRDP_OffscreenSupportLevel, 0) || |
639 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_OffscreenCacheSize, 7680) || |
640 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_OffscreenCacheEntries, 2000) || |
641 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_DrawNineGridCacheSize, 2560) || |
642 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_DrawNineGridCacheEntries, 256) || |
643 | 59.9k | !freerdp_settings_set_string(settings, FreeRDP_ClientDir, client_dll) || |
644 | 59.9k | !freerdp_settings_get_string(settings, FreeRDP_ClientDir) || |
645 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_RemoteWndSupportLevel, |
646 | 59.9k | WINDOW_LEVEL_SUPPORTED | WINDOW_LEVEL_SUPPORTED_EX) || |
647 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_RemoteAppNumIconCaches, 3) || |
648 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_RemoteAppNumIconCacheEntries, 12) || |
649 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_VCChunkSize, |
650 | 59.9k | (server && !remote) ? CHANNEL_CHUNK_MAX_LENGTH |
651 | 59.9k | : CHANNEL_CHUNK_LENGTH) || |
652 | | /* [MS-RDPBCGR] 2.2.7.2.7 Large Pointer Capability Set (TS_LARGE_POINTER_CAPABILITYSET) |
653 | | requires at least this size */ |
654 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_MultifragMaxRequestSize, |
655 | 59.9k | server ? 0 : 608299) || |
656 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_GatewayUseSameCredentials, FALSE) || |
657 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_GatewayBypassLocal, FALSE) || |
658 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_GatewayRpcTransport, TRUE) || |
659 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_GatewayHttpTransport, TRUE) || |
660 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_GatewayUdpTransport, TRUE) || |
661 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_GatewayHttpUseWebsockets, TRUE) || |
662 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_GatewayHttpExtAuthSspiNtlm, FALSE) || |
663 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_GatewayArmTransport, FALSE) || |
664 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_FastPathInput, TRUE) || |
665 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_FastPathOutput, TRUE) || |
666 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_LongCredentialsSupported, TRUE) || |
667 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_FrameAcknowledge, 2) || |
668 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_MouseMotion, TRUE) || |
669 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_NSCodecColorLossLevel, 3) || |
670 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_NSCodecAllowSubsampling, TRUE) || |
671 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_NSCodecAllowDynamicColorFidelity, TRUE) || |
672 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_AutoReconnectionEnabled, FALSE) || |
673 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_AutoReconnectMaxRetries, 20) || |
674 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_GfxThinClient, FALSE) || |
675 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_GfxSmallCache, TRUE) || |
676 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_GfxProgressive, FALSE) || |
677 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_GfxProgressiveV2, FALSE) || |
678 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_GfxPlanar, TRUE) || |
679 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_GfxH264, FALSE) || |
680 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_GfxAVC444, FALSE) || |
681 | 59.9k | !freerdp_settings_set_bool(settings, FreeRDP_GfxSendQoeAck, FALSE)) |
682 | 0 | goto out_fail; |
683 | 59.9k | { |
684 | 59.9k | ARC_CS_PRIVATE_PACKET cookie = { 0 }; |
685 | 59.9k | if (!freerdp_settings_set_pointer_len(settings, FreeRDP_ClientAutoReconnectCookie, &cookie, |
686 | 59.9k | 1)) |
687 | 0 | goto out_fail; |
688 | 59.9k | } |
689 | 59.9k | { |
690 | 59.9k | ARC_SC_PRIVATE_PACKET cookie = { 0 }; |
691 | 59.9k | if (!freerdp_settings_set_pointer_len(settings, FreeRDP_ServerAutoReconnectCookie, &cookie, |
692 | 59.9k | 1)) |
693 | 0 | goto out_fail; |
694 | 59.9k | } |
695 | | |
696 | 59.9k | settings->ClientTimeZone = (LPTIME_ZONE_INFORMATION)calloc(1, sizeof(TIME_ZONE_INFORMATION)); |
697 | | |
698 | 59.9k | if (!settings->ClientTimeZone) |
699 | 0 | goto out_fail; |
700 | | |
701 | 59.9k | if (!settings->ServerMode) |
702 | 44.9k | { |
703 | 44.9k | DYNAMIC_TIME_ZONE_INFORMATION dynamic = { 0 }; |
704 | 44.9k | TIME_ZONE_INFORMATION* tz = |
705 | 44.9k | freerdp_settings_get_pointer_writable(settings, FreeRDP_ClientTimeZone); |
706 | 44.9k | WINPR_ASSERT(tz); |
707 | | |
708 | 44.9k | GetTimeZoneInformation(tz); |
709 | 44.9k | GetDynamicTimeZoneInformation(&dynamic); |
710 | | |
711 | 44.9k | if (!freerdp_settings_set_string_from_utf16N(settings, FreeRDP_DynamicDSTTimeZoneKeyName, |
712 | 44.9k | dynamic.TimeZoneKeyName, |
713 | 44.9k | ARRAYSIZE(dynamic.TimeZoneKeyName))) |
714 | 0 | goto out_fail; |
715 | | |
716 | 44.9k | if (!freerdp_settings_set_bool(settings, FreeRDP_DynamicDaylightTimeDisabled, |
717 | 44.9k | dynamic.DynamicDaylightTimeDisabled)) |
718 | 0 | goto out_fail; |
719 | 44.9k | } |
720 | | |
721 | 59.9k | if (!freerdp_settings_set_bool(settings, FreeRDP_TcpKeepAlive, TRUE) || |
722 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_TcpKeepAliveRetries, 3) || |
723 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_TcpKeepAliveDelay, 5) || |
724 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_TcpKeepAliveInterval, 2) || |
725 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_TcpAckTimeout, 9000) || |
726 | 59.9k | !freerdp_settings_set_uint32(settings, FreeRDP_TcpConnectTimeout, 15000)) |
727 | 0 | goto out_fail; |
728 | | |
729 | 59.9k | if (!freerdp_settings_get_bool(settings, FreeRDP_ServerMode)) |
730 | 44.9k | { |
731 | 44.9k | BOOL rc = 0; |
732 | 44.9k | char* path = NULL; |
733 | 44.9k | if (!freerdp_settings_set_bool(settings, FreeRDP_RedirectClipboard, TRUE)) |
734 | 0 | goto out_fail; |
735 | | /* these values are used only by the client part */ |
736 | 44.9k | path = GetKnownPath(KNOWN_PATH_HOME); |
737 | 44.9k | rc = freerdp_settings_set_string(settings, FreeRDP_HomePath, path); |
738 | 44.9k | free(path); |
739 | | |
740 | 44.9k | if (!rc || !freerdp_settings_get_string(settings, FreeRDP_HomePath)) |
741 | 0 | goto out_fail; |
742 | | |
743 | | /* For default FreeRDP continue using same config directory |
744 | | * as in old releases. |
745 | | * Custom builds use <Vendor>/<Product> as config folder. */ |
746 | 44.9k | if (_stricmp(FREERDP_VENDOR_STRING, FREERDP_PRODUCT_STRING)) |
747 | 0 | { |
748 | 0 | BOOL res = TRUE; |
749 | 0 | base = GetKnownSubPath(KNOWN_PATH_XDG_CONFIG_HOME, FREERDP_VENDOR_STRING); |
750 | |
|
751 | 0 | if (base) |
752 | 0 | { |
753 | 0 | char* combined = GetCombinedPath(base, FREERDP_PRODUCT_STRING); |
754 | 0 | res = freerdp_settings_set_string(settings, FreeRDP_ConfigPath, combined); |
755 | 0 | free(combined); |
756 | 0 | } |
757 | |
|
758 | 0 | free(base); |
759 | 0 | if (!res) |
760 | 0 | goto out_fail; |
761 | 0 | } |
762 | 44.9k | else |
763 | 44.9k | { |
764 | 44.9k | BOOL res = 0; |
765 | 44.9k | char* cpath = NULL; |
766 | 44.9k | char product[sizeof(FREERDP_PRODUCT_STRING)] = { 0 }; |
767 | | |
768 | 404k | for (size_t i = 0; i < sizeof(product); i++) |
769 | 359k | product[i] = tolower(FREERDP_PRODUCT_STRING[i]); |
770 | | |
771 | 44.9k | cpath = GetKnownSubPath(KNOWN_PATH_XDG_CONFIG_HOME, product); |
772 | 44.9k | res = freerdp_settings_set_string(settings, FreeRDP_ConfigPath, cpath); |
773 | 44.9k | free(cpath); |
774 | 44.9k | if (!res) |
775 | 0 | goto out_fail; |
776 | 44.9k | } |
777 | | |
778 | 44.9k | if (!freerdp_settings_get_string(settings, FreeRDP_ConfigPath)) |
779 | 0 | goto out_fail; |
780 | 44.9k | } |
781 | | |
782 | 59.9k | settings_load_hkey_local_machine(settings); |
783 | | |
784 | 59.9k | if (!freerdp_settings_set_string(settings, FreeRDP_ActionScript, "~/.config/freerdp/action.sh")) |
785 | 0 | goto out_fail; |
786 | 59.9k | if (!freerdp_settings_set_bool(settings, FreeRDP_SmartcardLogon, FALSE)) |
787 | 0 | goto out_fail; |
788 | 59.9k | if (!freerdp_settings_set_uint32(settings, FreeRDP_TlsSecLevel, 1)) |
789 | 0 | goto out_fail; |
790 | 59.9k | settings->OrderSupport = calloc(1, 32); |
791 | | |
792 | 59.9k | freerdp_settings_set_uint16(settings, FreeRDP_TLSMinVersion, TLS1_VERSION); |
793 | 59.9k | freerdp_settings_set_uint16(settings, FreeRDP_TLSMaxVersion, 0); |
794 | | |
795 | 59.9k | if (!settings->OrderSupport) |
796 | 0 | goto out_fail; |
797 | | |
798 | 59.9k | if (!freerdp_settings_set_default_order_support(settings)) |
799 | 0 | goto out_fail; |
800 | | |
801 | 59.9k | const BOOL enable = freerdp_settings_get_bool(settings, FreeRDP_ServerMode); |
802 | | |
803 | 59.9k | { |
804 | 59.9k | const FreeRDP_Settings_Keys_Bool keys[] = { |
805 | 59.9k | FreeRDP_SupportDynamicTimeZone, FreeRDP_SupportGraphicsPipeline, |
806 | 59.9k | FreeRDP_SupportStatusInfoPdu, FreeRDP_SupportErrorInfoPdu, FreeRDP_SupportAsymetricKeys |
807 | 59.9k | }; |
808 | | |
809 | 359k | for (size_t x = 0; x < ARRAYSIZE(keys); x++) |
810 | 299k | { |
811 | 299k | if (!freerdp_settings_set_bool(settings, keys[x], enable)) |
812 | 0 | goto out_fail; |
813 | 299k | } |
814 | 59.9k | } |
815 | 59.9k | if (!freerdp_settings_set_bool(settings, FreeRDP_SupportSkipChannelJoin, TRUE)) |
816 | 0 | goto out_fail; |
817 | | |
818 | 59.9k | return settings; |
819 | 0 | out_fail: |
820 | 0 | freerdp_settings_free(settings); |
821 | 0 | return NULL; |
822 | 59.9k | } |
823 | | |
824 | | static void freerdp_settings_free_internal(rdpSettings* settings) |
825 | 89.8k | { |
826 | 89.8k | freerdp_server_license_issuers_free(settings); |
827 | 89.8k | freerdp_target_net_addresses_free(settings); |
828 | 89.8k | freerdp_device_collection_free(settings); |
829 | 89.8k | freerdp_static_channel_collection_free(settings); |
830 | 89.8k | freerdp_dynamic_channel_collection_free(settings); |
831 | | |
832 | 89.8k | freerdp_capability_buffer_free(settings); |
833 | | |
834 | | /* Free all strings, set other pointers NULL */ |
835 | 89.8k | freerdp_settings_free_keys(settings, TRUE); |
836 | 89.8k | } |
837 | | |
838 | | void freerdp_settings_free(rdpSettings* settings) |
839 | 104k | { |
840 | 104k | if (!settings) |
841 | 29.9k | return; |
842 | | |
843 | 74.8k | freerdp_settings_free_internal(settings); |
844 | 74.8k | free(settings); |
845 | 74.8k | } |
846 | | |
847 | | static BOOL freerdp_settings_int_buffer_copy(rdpSettings* _settings, const rdpSettings* settings) |
848 | 14.9k | { |
849 | 14.9k | BOOL rc = FALSE; |
850 | | |
851 | 14.9k | if (!_settings || !settings) |
852 | 0 | return FALSE; |
853 | | |
854 | 14.9k | { |
855 | 14.9k | const void* data = freerdp_settings_get_pointer(settings, FreeRDP_LoadBalanceInfo); |
856 | 14.9k | const UINT32 len = freerdp_settings_get_uint32(settings, FreeRDP_LoadBalanceInfoLength); |
857 | 14.9k | if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_LoadBalanceInfo, data, len)) |
858 | 0 | return FALSE; |
859 | 14.9k | } |
860 | 14.9k | { |
861 | 14.9k | const void* data = freerdp_settings_get_pointer(settings, FreeRDP_ServerRandom); |
862 | 14.9k | const UINT32 len = freerdp_settings_get_uint32(settings, FreeRDP_ServerRandomLength); |
863 | 14.9k | if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_ServerRandom, data, len)) |
864 | 0 | return FALSE; |
865 | 14.9k | } |
866 | 14.9k | { |
867 | 14.9k | const void* data = freerdp_settings_get_pointer(settings, FreeRDP_ClientRandom); |
868 | 14.9k | const UINT32 len = freerdp_settings_get_uint32(settings, FreeRDP_ClientRandomLength); |
869 | 14.9k | if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_ClientRandom, data, len)) |
870 | 0 | return FALSE; |
871 | 14.9k | } |
872 | 14.9k | if (!freerdp_server_license_issuers_copy(_settings, settings->ServerLicenseProductIssuers, |
873 | 14.9k | settings->ServerLicenseProductIssuersCount)) |
874 | 0 | return FALSE; |
875 | | |
876 | 14.9k | { |
877 | 14.9k | const void* data = freerdp_settings_get_pointer(settings, FreeRDP_ServerCertificate); |
878 | 14.9k | const UINT32 len = freerdp_settings_get_uint32(settings, FreeRDP_ServerCertificateLength); |
879 | 14.9k | if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_ServerCertificate, data, len)) |
880 | 0 | return FALSE; |
881 | 14.9k | } |
882 | 14.9k | if (settings->RdpServerCertificate) |
883 | 14.9k | { |
884 | 14.9k | rdpCertificate* cert = freerdp_certificate_clone(settings->RdpServerCertificate); |
885 | 14.9k | if (!cert) |
886 | 0 | goto out_fail; |
887 | 14.9k | if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_RdpServerCertificate, cert, 1)) |
888 | 0 | goto out_fail; |
889 | 14.9k | } |
890 | 0 | else |
891 | 0 | { |
892 | 0 | if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_RdpServerCertificate, NULL, 0)) |
893 | 0 | goto out_fail; |
894 | 0 | } |
895 | | |
896 | 14.9k | if (settings->RdpServerRsaKey) |
897 | 0 | { |
898 | 0 | rdpPrivateKey* key = freerdp_key_clone(settings->RdpServerRsaKey); |
899 | 0 | if (!key) |
900 | 0 | goto out_fail; |
901 | 0 | if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_RdpServerRsaKey, key, 1)) |
902 | 0 | goto out_fail; |
903 | 0 | } |
904 | 14.9k | else |
905 | 14.9k | { |
906 | 14.9k | if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_RdpServerRsaKey, NULL, 0)) |
907 | 0 | goto out_fail; |
908 | 14.9k | } |
909 | | |
910 | 14.9k | if (!freerdp_settings_set_uint32(_settings, FreeRDP_ChannelCount, |
911 | 14.9k | freerdp_settings_get_uint32(settings, FreeRDP_ChannelCount))) |
912 | 0 | goto out_fail; |
913 | 14.9k | if (!freerdp_settings_set_uint32( |
914 | 14.9k | _settings, FreeRDP_ChannelDefArraySize, |
915 | 14.9k | freerdp_settings_get_uint32(settings, FreeRDP_ChannelDefArraySize))) |
916 | 0 | goto out_fail; |
917 | | |
918 | 14.9k | const UINT32 defArraySize = freerdp_settings_get_uint32(settings, FreeRDP_ChannelDefArraySize); |
919 | 14.9k | const CHANNEL_DEF* defArray = freerdp_settings_get_pointer(settings, FreeRDP_ChannelDefArray); |
920 | 14.9k | if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_ChannelDefArray, defArray, |
921 | 14.9k | defArraySize)) |
922 | 0 | goto out_fail; |
923 | | |
924 | 14.9k | { |
925 | 14.9k | const UINT32 count = freerdp_settings_get_uint32(settings, FreeRDP_MonitorDefArraySize); |
926 | 14.9k | const rdpMonitor* monitors = |
927 | 14.9k | freerdp_settings_get_pointer(settings, FreeRDP_MonitorDefArray); |
928 | | |
929 | 14.9k | if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_MonitorDefArray, monitors, count)) |
930 | 0 | goto out_fail; |
931 | 14.9k | } |
932 | | |
933 | 14.9k | if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_MonitorIds, NULL, 16)) |
934 | 0 | goto out_fail; |
935 | | |
936 | 14.9k | const UINT32 monitorIdSize = freerdp_settings_get_uint32(settings, FreeRDP_NumMonitorIds); |
937 | 14.9k | const UINT32* monitorIds = freerdp_settings_get_pointer(settings, FreeRDP_MonitorIds); |
938 | 14.9k | if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_MonitorIds, monitorIds, monitorIdSize)) |
939 | 0 | goto out_fail; |
940 | | |
941 | 14.9k | _settings->OrderSupport = malloc(32); |
942 | | |
943 | 14.9k | if (!_settings->OrderSupport) |
944 | 0 | goto out_fail; |
945 | | |
946 | 14.9k | if (!freerdp_capability_buffer_copy(_settings, settings)) |
947 | 0 | goto out_fail; |
948 | 14.9k | CopyMemory(_settings->OrderSupport, settings->OrderSupport, 32); |
949 | | |
950 | 14.9k | const UINT32 cellInfoSize = |
951 | 14.9k | freerdp_settings_get_uint32(settings, FreeRDP_BitmapCacheV2NumCells); |
952 | 14.9k | const BITMAP_CACHE_V2_CELL_INFO* cellInfo = |
953 | 14.9k | freerdp_settings_get_pointer(settings, FreeRDP_BitmapCacheV2CellInfo); |
954 | 14.9k | if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_BitmapCacheV2CellInfo, cellInfo, |
955 | 14.9k | cellInfoSize)) |
956 | 0 | goto out_fail; |
957 | | |
958 | 14.9k | const UINT32 glyphCacheCount = 10; |
959 | 14.9k | const GLYPH_CACHE_DEFINITION* glyphCache = |
960 | 14.9k | freerdp_settings_get_pointer(settings, FreeRDP_GlyphCache); |
961 | 14.9k | if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_GlyphCache, glyphCache, |
962 | 14.9k | glyphCacheCount)) |
963 | 0 | goto out_fail; |
964 | | |
965 | 14.9k | const UINT32 fragCacheCount = 1; |
966 | 14.9k | const GLYPH_CACHE_DEFINITION* fragCache = |
967 | 14.9k | freerdp_settings_get_pointer(settings, FreeRDP_FragCache); |
968 | 14.9k | if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_FragCache, fragCache, fragCacheCount)) |
969 | 0 | goto out_fail; |
970 | | |
971 | 14.9k | if (!freerdp_settings_set_pointer_len( |
972 | 14.9k | _settings, FreeRDP_ClientAutoReconnectCookie, |
973 | 14.9k | freerdp_settings_get_pointer(settings, FreeRDP_ClientAutoReconnectCookie), 1)) |
974 | 0 | goto out_fail; |
975 | 14.9k | if (!freerdp_settings_set_pointer_len( |
976 | 14.9k | _settings, FreeRDP_ServerAutoReconnectCookie, |
977 | 14.9k | freerdp_settings_get_pointer(settings, FreeRDP_ServerAutoReconnectCookie), 1)) |
978 | 0 | goto out_fail; |
979 | | |
980 | 14.9k | const TIME_ZONE_INFORMATION* tz = |
981 | 14.9k | freerdp_settings_get_pointer(settings, FreeRDP_ClientTimeZone); |
982 | 14.9k | if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_ClientTimeZone, tz, 1)) |
983 | 0 | goto out_fail; |
984 | | |
985 | 14.9k | if (!freerdp_settings_set_uint32( |
986 | 14.9k | _settings, FreeRDP_RedirectionPasswordLength, |
987 | 14.9k | freerdp_settings_get_uint32(settings, FreeRDP_RedirectionPasswordLength))) |
988 | 0 | goto out_fail; |
989 | 14.9k | const UINT32 redirectionPasswordLength = |
990 | 14.9k | freerdp_settings_get_uint32(settings, FreeRDP_RedirectionPasswordLength); |
991 | 14.9k | const BYTE* pwd = freerdp_settings_get_pointer(settings, FreeRDP_RedirectionPassword); |
992 | 14.9k | if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_RedirectionPassword, pwd, |
993 | 14.9k | redirectionPasswordLength)) |
994 | 0 | goto out_fail; |
995 | | |
996 | 14.9k | const UINT32 RedirectionTsvUrlLength = |
997 | 14.9k | freerdp_settings_get_uint32(settings, FreeRDP_RedirectionTsvUrlLength); |
998 | 14.9k | const BYTE* RedirectionTsvUrl = |
999 | 14.9k | freerdp_settings_get_pointer(settings, FreeRDP_RedirectionTsvUrl); |
1000 | 14.9k | if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_RedirectionTsvUrl, RedirectionTsvUrl, |
1001 | 14.9k | RedirectionTsvUrlLength)) |
1002 | 0 | goto out_fail; |
1003 | | |
1004 | 14.9k | const UINT32 nrports = freerdp_settings_get_uint32(settings, FreeRDP_TargetNetAddressCount); |
1005 | 14.9k | if (!freerdp_target_net_adresses_reset(_settings, nrports)) |
1006 | 0 | return FALSE; |
1007 | | |
1008 | 14.9k | for (UINT32 i = 0; i < nrports; i++) |
1009 | 0 | { |
1010 | 0 | const char* address = |
1011 | 0 | freerdp_settings_get_pointer_array(settings, FreeRDP_TargetNetAddresses, i); |
1012 | 0 | const UINT32* port = |
1013 | 0 | freerdp_settings_get_pointer_array(settings, FreeRDP_TargetNetPorts, i); |
1014 | 0 | if (!freerdp_settings_set_pointer_array(_settings, FreeRDP_TargetNetAddresses, i, address)) |
1015 | 0 | return FALSE; |
1016 | 0 | if (!freerdp_settings_set_pointer_array(_settings, FreeRDP_TargetNetPorts, i, port)) |
1017 | 0 | return FALSE; |
1018 | 0 | } |
1019 | | |
1020 | 14.9k | { |
1021 | 14.9k | const UINT32 len = freerdp_settings_get_uint32(_settings, FreeRDP_DeviceArraySize); |
1022 | 14.9k | const UINT32 count = freerdp_settings_get_uint32(settings, FreeRDP_DeviceCount); |
1023 | | |
1024 | 14.9k | if (len < count) |
1025 | 0 | goto out_fail; |
1026 | 14.9k | if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_DeviceArray, NULL, len)) |
1027 | 0 | goto out_fail; |
1028 | 14.9k | if (!freerdp_settings_set_uint32(_settings, FreeRDP_DeviceCount, count)) |
1029 | 0 | goto out_fail; |
1030 | | |
1031 | 14.9k | for (size_t index = 0; index < count; index++) |
1032 | 0 | { |
1033 | 0 | const RDPDR_DEVICE* argv = |
1034 | 0 | freerdp_settings_get_pointer_array(settings, FreeRDP_DeviceArray, index); |
1035 | 0 | if (!freerdp_settings_set_pointer_array(_settings, FreeRDP_DeviceArray, index, argv)) |
1036 | 0 | goto out_fail; |
1037 | 0 | } |
1038 | 14.9k | } |
1039 | 14.9k | { |
1040 | 14.9k | const UINT32 len = freerdp_settings_get_uint32(_settings, FreeRDP_StaticChannelArraySize); |
1041 | 14.9k | const UINT32 count = freerdp_settings_get_uint32(settings, FreeRDP_StaticChannelCount); |
1042 | | |
1043 | 14.9k | if (len < count) |
1044 | 0 | goto out_fail; |
1045 | 14.9k | if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_StaticChannelArray, NULL, len)) |
1046 | 0 | goto out_fail; |
1047 | 14.9k | if (!freerdp_settings_set_uint32(_settings, FreeRDP_StaticChannelCount, count)) |
1048 | 0 | goto out_fail; |
1049 | | |
1050 | 14.9k | for (size_t index = 0; index < count; index++) |
1051 | 0 | { |
1052 | 0 | const ADDIN_ARGV* argv = |
1053 | 0 | freerdp_settings_get_pointer_array(settings, FreeRDP_StaticChannelArray, index); |
1054 | 0 | if (!freerdp_settings_set_pointer_array(_settings, FreeRDP_StaticChannelArray, index, |
1055 | 0 | argv)) |
1056 | 0 | goto out_fail; |
1057 | 0 | } |
1058 | 14.9k | } |
1059 | 14.9k | { |
1060 | 14.9k | const UINT32 len = freerdp_settings_get_uint32(_settings, FreeRDP_DynamicChannelArraySize); |
1061 | 14.9k | const UINT32 count = freerdp_settings_get_uint32(settings, FreeRDP_DynamicChannelCount); |
1062 | | |
1063 | 14.9k | if (len < count) |
1064 | 0 | goto out_fail; |
1065 | 14.9k | if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_DynamicChannelArray, NULL, len)) |
1066 | 0 | goto out_fail; |
1067 | 14.9k | if (!freerdp_settings_set_uint32(_settings, FreeRDP_DynamicChannelCount, count)) |
1068 | 0 | goto out_fail; |
1069 | | |
1070 | 14.9k | for (size_t index = 0; index < count; index++) |
1071 | 0 | { |
1072 | 0 | const ADDIN_ARGV* argv = |
1073 | 0 | freerdp_settings_get_pointer_array(settings, FreeRDP_DynamicChannelArray, index); |
1074 | 0 | if (!freerdp_settings_set_pointer_array(_settings, FreeRDP_DynamicChannelArray, index, |
1075 | 0 | argv)) |
1076 | 0 | goto out_fail; |
1077 | 0 | } |
1078 | 14.9k | } |
1079 | | |
1080 | 14.9k | rc = freerdp_settings_set_string(_settings, FreeRDP_ActionScript, |
1081 | 14.9k | freerdp_settings_get_string(settings, FreeRDP_ActionScript)); |
1082 | | |
1083 | 14.9k | out_fail: |
1084 | 14.9k | return rc; |
1085 | 14.9k | } |
1086 | | |
1087 | | BOOL freerdp_settings_copy(rdpSettings* _settings, const rdpSettings* settings) |
1088 | 14.9k | { |
1089 | 14.9k | BOOL rc = 0; |
1090 | | |
1091 | 14.9k | if (!settings || !_settings) |
1092 | 0 | return FALSE; |
1093 | | |
1094 | | /* This is required to free all non string buffers */ |
1095 | 14.9k | freerdp_settings_free_internal(_settings); |
1096 | | /* This copies everything except allocated non string buffers. reset all allocated buffers to |
1097 | | * NULL to fix issues during cleanup */ |
1098 | 14.9k | rc = freerdp_settings_clone_keys(_settings, settings); |
1099 | | |
1100 | 14.9k | _settings->LoadBalanceInfo = NULL; |
1101 | 14.9k | _settings->ServerRandom = NULL; |
1102 | 14.9k | _settings->ClientRandom = NULL; |
1103 | 14.9k | _settings->ServerCertificate = NULL; |
1104 | 14.9k | _settings->RdpServerCertificate = NULL; |
1105 | 14.9k | _settings->RdpServerRsaKey = NULL; |
1106 | 14.9k | _settings->ChannelDefArray = NULL; |
1107 | 14.9k | _settings->MonitorDefArray = NULL; |
1108 | 14.9k | _settings->MonitorIds = NULL; |
1109 | 14.9k | _settings->OrderSupport = NULL; |
1110 | 14.9k | _settings->BitmapCacheV2CellInfo = NULL; |
1111 | 14.9k | _settings->GlyphCache = NULL; |
1112 | 14.9k | _settings->FragCache = NULL; |
1113 | 14.9k | _settings->ClientAutoReconnectCookie = NULL; |
1114 | 14.9k | _settings->ServerAutoReconnectCookie = NULL; |
1115 | 14.9k | _settings->ClientTimeZone = NULL; |
1116 | 14.9k | _settings->RedirectionPassword = NULL; |
1117 | 14.9k | _settings->RedirectionTsvUrl = NULL; |
1118 | 14.9k | _settings->TargetNetAddresses = NULL; |
1119 | 14.9k | _settings->TargetNetPorts = NULL; |
1120 | 14.9k | _settings->DeviceArray = NULL; |
1121 | 14.9k | _settings->StaticChannelArray = NULL; |
1122 | 14.9k | _settings->DynamicChannelArray = NULL; |
1123 | 14.9k | _settings->ReceivedCapabilities = NULL; |
1124 | 14.9k | _settings->ReceivedCapabilityData = NULL; |
1125 | 14.9k | _settings->ReceivedCapabilityDataSizes = NULL; |
1126 | | |
1127 | 14.9k | _settings->ServerLicenseProductIssuersCount = 0; |
1128 | 14.9k | _settings->ServerLicenseProductIssuers = NULL; |
1129 | | |
1130 | 14.9k | if (!rc) |
1131 | 0 | goto out_fail; |
1132 | | |
1133 | | /* Begin copying */ |
1134 | 14.9k | if (!freerdp_settings_int_buffer_copy(_settings, settings)) |
1135 | 0 | goto out_fail; |
1136 | 14.9k | return TRUE; |
1137 | 0 | out_fail: |
1138 | 0 | freerdp_settings_free_internal(_settings); |
1139 | 0 | return FALSE; |
1140 | 14.9k | } |
1141 | | |
1142 | | rdpSettings* freerdp_settings_clone(const rdpSettings* settings) |
1143 | 14.9k | { |
1144 | 14.9k | rdpSettings* _settings = (rdpSettings*)calloc(1, sizeof(rdpSettings)); |
1145 | | |
1146 | 14.9k | if (!freerdp_settings_copy(_settings, settings)) |
1147 | 0 | goto out_fail; |
1148 | | |
1149 | 14.9k | return _settings; |
1150 | 0 | out_fail: |
1151 | 0 | freerdp_settings_free(_settings); |
1152 | 0 | return NULL; |
1153 | 14.9k | } |
1154 | | #ifdef _MSC_VER |
1155 | | #pragma warning(pop) |
1156 | | #endif |
1157 | | |
1158 | | static void zfree(WCHAR* str, size_t len) |
1159 | 0 | { |
1160 | 0 | if (str) |
1161 | 0 | memset(str, 0, len * sizeof(WCHAR)); |
1162 | 0 | free(str); |
1163 | 0 | } |
1164 | | |
1165 | | BOOL identity_set_from_settings_with_pwd(SEC_WINNT_AUTH_IDENTITY* identity, |
1166 | | const rdpSettings* settings, |
1167 | | FreeRDP_Settings_Keys_String UserId, |
1168 | | FreeRDP_Settings_Keys_String DomainId, |
1169 | | const WCHAR* Password, size_t pwdLen) |
1170 | 0 | { |
1171 | 0 | WINPR_ASSERT(identity); |
1172 | 0 | WINPR_ASSERT(settings); |
1173 | | |
1174 | 0 | size_t UserLen = 0; |
1175 | 0 | size_t DomainLen = 0; |
1176 | |
|
1177 | 0 | WCHAR* Username = freerdp_settings_get_string_as_utf16(settings, UserId, &UserLen); |
1178 | 0 | WCHAR* Domain = freerdp_settings_get_string_as_utf16(settings, DomainId, &DomainLen); |
1179 | |
|
1180 | 0 | const int rc = sspi_SetAuthIdentityWithLengthW(identity, Username, UserLen, Domain, DomainLen, |
1181 | 0 | Password, pwdLen); |
1182 | 0 | zfree(Username, UserLen); |
1183 | 0 | zfree(Domain, DomainLen); |
1184 | 0 | if (rc < 0) |
1185 | 0 | return FALSE; |
1186 | 0 | return TRUE; |
1187 | 0 | } |
1188 | | |
1189 | | BOOL identity_set_from_settings(SEC_WINNT_AUTH_IDENTITY_W* identity, const rdpSettings* settings, |
1190 | | FreeRDP_Settings_Keys_String UserId, |
1191 | | FreeRDP_Settings_Keys_String DomainId, |
1192 | | FreeRDP_Settings_Keys_String PwdId) |
1193 | 0 | { |
1194 | 0 | WINPR_ASSERT(identity); |
1195 | 0 | WINPR_ASSERT(settings); |
1196 | | |
1197 | 0 | size_t PwdLen = 0; |
1198 | |
|
1199 | 0 | WCHAR* Password = freerdp_settings_get_string_as_utf16(settings, PwdId, &PwdLen); |
1200 | |
|
1201 | 0 | const BOOL rc = |
1202 | 0 | identity_set_from_settings_with_pwd(identity, settings, UserId, DomainId, Password, PwdLen); |
1203 | 0 | zfree(Password, PwdLen); |
1204 | 0 | return rc; |
1205 | 0 | } |
1206 | | |
1207 | | BOOL identity_set_from_smartcard_hash(SEC_WINNT_AUTH_IDENTITY_W* identity, |
1208 | | const rdpSettings* settings, |
1209 | | FreeRDP_Settings_Keys_String userId, |
1210 | | FreeRDP_Settings_Keys_String domainId, |
1211 | | FreeRDP_Settings_Keys_String pwdId, const BYTE* certSha1, |
1212 | | size_t sha1len) |
1213 | 0 | { |
1214 | | #ifdef _WIN32 |
1215 | | CERT_CREDENTIAL_INFO certInfo = { sizeof(CERT_CREDENTIAL_INFO), { 0 } }; |
1216 | | LPWSTR marshalledCredentials = NULL; |
1217 | | |
1218 | | memcpy(certInfo.rgbHashOfCert, certSha1, MIN(sha1len, sizeof(certInfo.rgbHashOfCert))); |
1219 | | |
1220 | | if (!CredMarshalCredentialW(CertCredential, &certInfo, &marshalledCredentials)) |
1221 | | { |
1222 | | WLog_ERR(TAG, "error marshalling cert credentials"); |
1223 | | return FALSE; |
1224 | | } |
1225 | | |
1226 | | size_t pwdLen = 0; |
1227 | | WCHAR* Password = freerdp_settings_get_string_as_utf16(settings, pwdId, &pwdLen); |
1228 | | const int rc = sspi_SetAuthIdentityWithLengthW( |
1229 | | identity, marshalledCredentials, _wcslen(marshalledCredentials), NULL, 0, Password, pwdLen); |
1230 | | zfree(Password, pwdLen); |
1231 | | CredFree(marshalledCredentials); |
1232 | | if (rc < 0) |
1233 | | return FALSE; |
1234 | | |
1235 | | #else |
1236 | 0 | if (!identity_set_from_settings(identity, settings, userId, domainId, pwdId)) |
1237 | 0 | return FALSE; |
1238 | 0 | #endif /* _WIN32 */ |
1239 | 0 | return TRUE; |
1240 | 0 | } |
1241 | | |
1242 | | const char* freerdp_settings_glyph_level_string(UINT32 level, char* buffer, size_t size) |
1243 | 0 | { |
1244 | 0 | const char* str = "GLYPH_SUPPORT_UNKNOWN"; |
1245 | 0 | switch (level) |
1246 | 0 | { |
1247 | 0 | case GLYPH_SUPPORT_NONE: |
1248 | 0 | str = "GLYPH_SUPPORT_NONE"; |
1249 | 0 | break; |
1250 | 0 | case GLYPH_SUPPORT_PARTIAL: |
1251 | 0 | str = "GLYPH_SUPPORT_PARTIAL"; |
1252 | 0 | break; |
1253 | 0 | case GLYPH_SUPPORT_FULL: |
1254 | 0 | str = "GLYPH_SUPPORT_FULL"; |
1255 | 0 | break; |
1256 | 0 | case GLYPH_SUPPORT_ENCODE: |
1257 | 0 | str = "GLYPH_SUPPORT_ENCODE"; |
1258 | 0 | break; |
1259 | 0 | default: |
1260 | 0 | break; |
1261 | 0 | } |
1262 | | |
1263 | 0 | _snprintf(buffer, size, "%s[0x%08" PRIx32 "]", str, level); |
1264 | 0 | return buffer; |
1265 | 0 | } |
1266 | | |
1267 | | BOOL freerdp_target_net_adresses_reset(rdpSettings* settings, size_t size) |
1268 | 14.9k | { |
1269 | 14.9k | freerdp_target_net_addresses_free(settings); |
1270 | | |
1271 | 14.9k | if (size > 0) |
1272 | 0 | { |
1273 | 0 | if (!freerdp_settings_set_pointer_len_(settings, FreeRDP_TargetNetPorts, -1, NULL, size, |
1274 | 0 | sizeof(UINT32))) |
1275 | 0 | return FALSE; |
1276 | 0 | if (!freerdp_settings_set_pointer_len_(settings, FreeRDP_TargetNetAddresses, |
1277 | 0 | FreeRDP_TargetNetAddressCount, NULL, size, |
1278 | 0 | sizeof(char*))) |
1279 | 0 | return FALSE; |
1280 | 0 | } |
1281 | 14.9k | return TRUE; |
1282 | 14.9k | } |