FreeRDP
Loading...
Searching...
No Matches
Proxy Configuration

Data Structures

struct  proxyConfig
 

Functions

FREERDP_API BOOL pf_server_config_dump (const char *file)
 pf_server_config_dump Dumps a default INI configuration file
 
FREERDP_API void pf_server_config_free (proxyConfig *config)
 pf_server_config_free Releases all resources associated with proxyConfig
 
WINPR_ATTR_NODISCARD FREERDP_API proxyConfig * server_config_load_ini (wIniFile *ini)
 server_config_load_ini Create a proxyConfig from a already loaded INI file.
 
WINPR_ATTR_NODISCARD FREERDP_API proxyConfig * pf_server_config_load_file (const char *path)
 pf_server_config_load_file Create a proxyConfig from a INI file found at path.
 
WINPR_ATTR_NODISCARD FREERDP_API proxyConfig * pf_server_config_load_buffer (const char *buffer)
 pf_server_config_load_buffer Create a proxyConfig from a memory string buffer in INI file format
 
FREERDP_API void pf_server_config_print (const proxyConfig *config)
 pf_server_config_print Print the configuration to stdout
 
FREERDP_API size_t pf_config_required_plugins_count (const proxyConfig *config)
 pf_config_required_plugins_count
 
FREERDP_API const char * pf_config_required_plugin (const proxyConfig *config, size_t index)
 pf_config_required_plugin
 
FREERDP_API size_t pf_config_modules_count (const proxyConfig *config)
 pf_config_modules_count
 
FREERDP_API const char ** pf_config_modules (const proxyConfig *config)
 pf_config_modules
 
FREERDP_API BOOL pf_config_clone (proxyConfig **dst, const proxyConfig *config)
 pf_config_clone Create a copy of the configuration
 
FREERDP_API BOOL pf_config_plugin (proxyPluginsManager *plugins_manager, void *userdata)
 pf_config_plugin Register a proxy plugin handling event filtering defined in the configuration.
 
FREERDP_API const char * pf_config_get (const proxyConfig *config, const char *section, const char *key)
 pf_config_get get a value for a section/key
 

Detailed Description

FreeRDP: A Remote Desktop Protocol Implementation FreeRDP Proxy Server

Copyright 2021-2023 Armin Novak armin.nosp@m..nov.nosp@m.ak@th.nosp@m.inca.nosp@m.st.co.nosp@m.m Copyright 2021-2023 Thincast Technologies GmbH

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Function Documentation

◆ pf_config_clone()

FREERDP_API BOOL pf_config_clone ( proxyConfig **  dst,
const proxyConfig *  config 
)

pf_config_clone Create a copy of the configuration

Parameters
dstA pointer that receives the newly allocated copy
configThe source configuration to copy
Returns
TRUE for success, FALSE otherwise

Definition at line 969 of file pf_config.c.

970{
971 proxyConfig* tmp = calloc(1, sizeof(proxyConfig));
972
973 WINPR_ASSERT(dst);
974 WINPR_ASSERT(config);
975
976 if (!tmp)
977 return FALSE;
978
979 *tmp = *config;
980
981 if (!pf_config_copy_string(&tmp->Host, config->Host))
982 goto fail;
983 if (!pf_config_copy_string(&tmp->TargetHost, config->TargetHost))
984 goto fail;
985
986 if (!pf_config_copy_string_list(&tmp->Passthrough, &tmp->PassthroughCount, config->Passthrough,
987 config->PassthroughCount))
988 goto fail;
989 if (!pf_config_copy_string_list(&tmp->Intercept, &tmp->InterceptCount, config->Intercept,
990 config->InterceptCount))
991 goto fail;
992 if (!pf_config_copy_string_list(&tmp->Modules, &tmp->ModulesCount, config->Modules,
993 config->ModulesCount))
994 goto fail;
995 if (!pf_config_copy_string_list(&tmp->RequiredPlugins, &tmp->RequiredPluginsCount,
996 config->RequiredPlugins, config->RequiredPluginsCount))
997 goto fail;
998 if (!pf_config_copy_string(&tmp->CertificateFile, config->CertificateFile))
999 goto fail;
1000 if (!pf_config_copy_string(&tmp->CertificateContent, config->CertificateContent))
1001 goto fail;
1002 if (!pf_config_copy_string_n(&tmp->CertificatePEM, config->CertificatePEM,
1003 config->CertificatePEMLength))
1004 goto fail;
1005 if (!pf_config_copy_string(&tmp->PrivateKeyFile, config->PrivateKeyFile))
1006 goto fail;
1007 if (!pf_config_copy_string(&tmp->PrivateKeyContent, config->PrivateKeyContent))
1008 goto fail;
1009 if (!pf_config_copy_string_n(&tmp->PrivateKeyPEM, config->PrivateKeyPEM,
1010 config->PrivateKeyPEMLength))
1011 goto fail;
1012
1013 tmp->ini = IniFile_Clone(config->ini);
1014 if (!tmp->ini)
1015 goto fail;
1016
1017 *dst = tmp;
1018 return TRUE;
1019
1020fail:
1021 WINPR_PRAGMA_DIAG_PUSH
1022 WINPR_PRAGMA_DIAG_IGNORED_MISMATCHED_DEALLOC
1024 WINPR_PRAGMA_DIAG_POP
1025 return FALSE;
1026}
void pf_server_config_free(proxyConfig *config)
pf_server_config_free Releases all resources associated with proxyConfig
Definition pf_config.c:863

References pf_server_config_free().

Here is the call graph for this function:

◆ pf_config_get()

FREERDP_API const char * pf_config_get ( const proxyConfig *  config,
const char *  section,
const char *  key 
)

pf_config_get get a value for a section/key

Parameters
configA pointer to the proxyConfig. Must NOT be NULL.
sectionThe name of the section the key is in, must not be NULL
keyThe name of the key to look for. Must not be NULL
Returns
A pointer to the value for section/key or NULL if not found

Definition at line 1327 of file pf_config.c.

1328{
1329 WINPR_ASSERT(config);
1330 WINPR_ASSERT(config->ini);
1331 WINPR_ASSERT(section);
1332 WINPR_ASSERT(key);
1333
1334 return IniFile_GetKeyValueString(config->ini, section, key);
1335}

◆ pf_config_modules()

FREERDP_API const char ** pf_config_modules ( const proxyConfig *  config)

pf_config_modules

Parameters
configA pointer to the proxyConfig. Must NOT be NULL.
Returns
An array of strings of size pf_config_modules_count with the module names.

Definition at line 910 of file pf_config.c.

911{
912 union
913 {
914 char** ppc;
915 const char** cppc;
916 } cnv;
917
918 WINPR_ASSERT(config);
919
920 cnv.ppc = config->Modules;
921 return cnv.cppc;
922}

◆ pf_config_modules_count()

FREERDP_API size_t pf_config_modules_count ( const proxyConfig *  config)

pf_config_modules_count

Parameters
configA pointer to the proxyConfig. Must NOT be NULL.
Returns
The number of proxy modules configured.

Definition at line 904 of file pf_config.c.

905{
906 WINPR_ASSERT(config);
907 return config->ModulesCount;
908}

◆ pf_config_plugin()

FREERDP_API BOOL pf_config_plugin ( proxyPluginsManager *  plugins_manager,
void *  userdata 
)

pf_config_plugin Register a proxy plugin handling event filtering defined in the configuration.

Parameters
plugins_managerThe plugin manager
userdataA proxyConfig* to use as reference
Returns
TRUE for success, FALSE for failure

Definition at line 1295 of file pf_config.c.

1296{
1297 struct config_plugin_data* custom = NULL;
1298 proxyPlugin plugin = { 0 };
1299
1300 plugin.name = config_plugin_name;
1301 plugin.description = config_plugin_desc;
1302 plugin.PluginUnload = config_plugin_unload;
1303
1304 plugin.KeyboardEvent = config_plugin_keyboard_event;
1305 plugin.UnicodeEvent = config_plugin_unicode_event;
1306 plugin.MouseEvent = config_plugin_mouse_event;
1307 plugin.MouseExEvent = config_plugin_mouse_ex_event;
1308 plugin.ClientChannelData = config_plugin_client_channel_data;
1309 plugin.ServerChannelData = config_plugin_server_channel_data;
1310 plugin.ChannelCreate = config_plugin_channel_create;
1311 plugin.DynamicChannelCreate = config_plugin_dynamic_channel_create;
1312 plugin.userdata = userdata;
1313
1314 custom = calloc(1, sizeof(struct config_plugin_data));
1315 if (!custom)
1316 return FALSE;
1317
1318 custom->mgr = plugins_manager;
1319 custom->config = userdata;
1320
1321 plugin.custom = custom;
1322 plugin.userdata = userdata;
1323
1324 return plugins_manager->RegisterPlugin(plugins_manager, &plugin);
1325}

◆ pf_config_required_plugin()

FREERDP_API const char * pf_config_required_plugin ( const proxyConfig *  config,
size_t  index 
)

pf_config_required_plugin

Parameters
configA pointer to the proxyConfig. Must NOT be NULL.
indexThe index of the plugin to return
Returns
The name of the plugin or NULL.

Definition at line 895 of file pf_config.c.

896{
897 WINPR_ASSERT(config);
898 if (index >= config->RequiredPluginsCount)
899 return NULL;
900
901 return config->RequiredPlugins[index];
902}

◆ pf_config_required_plugins_count()

FREERDP_API size_t pf_config_required_plugins_count ( const proxyConfig *  config)

pf_config_required_plugins_count

Parameters
configA pointer to the proxyConfig. Must NOT be NULL.
Returns
The number of required plugins configured.

Definition at line 889 of file pf_config.c.

890{
891 WINPR_ASSERT(config);
892 return config->RequiredPluginsCount;
893}

◆ pf_server_config_dump()

FREERDP_API BOOL pf_server_config_dump ( const char *  file)

pf_server_config_dump Dumps a default INI configuration file

Parameters
fileThe file to write to. Existing files are truncated.
Returns
TRUE for success, FALSE if the file could not be written.

Definition at line 598 of file pf_config.c.

599{
600 BOOL rc = FALSE;
601 wIniFile* ini = IniFile_New();
602 if (!ini)
603 return FALSE;
604
605 /* Proxy server configuration */
606 if (IniFile_SetKeyValueString(ini, section_server, key_host, "0.0.0.0") < 0)
607 goto fail;
608 if (IniFile_SetKeyValueInt(ini, section_server, key_port, 3389) < 0)
609 goto fail;
610
611 /* Target configuration */
612 if (IniFile_SetKeyValueString(ini, section_target, key_host, "somehost.example.com") < 0)
613 goto fail;
614 if (IniFile_SetKeyValueInt(ini, section_target, key_port, 3389) < 0)
615 goto fail;
616 if (IniFile_SetKeyValueString(ini, section_target, key_target_fixed, bool_str_true) < 0)
617 goto fail;
618 if (IniFile_SetKeyValueInt(ini, section_target, key_target_tls_seclevel, 1) < 0)
619 goto fail;
620
621 /* Channel configuration */
622 if (IniFile_SetKeyValueString(ini, section_channels, key_channels_gfx, bool_str_true) < 0)
623 goto fail;
624 if (IniFile_SetKeyValueString(ini, section_channels, key_channels_disp, bool_str_true) < 0)
625 goto fail;
626 if (IniFile_SetKeyValueString(ini, section_channels, key_channels_clip, bool_str_true) < 0)
627 goto fail;
628 if (IniFile_SetKeyValueString(ini, section_channels, key_channels_mic, bool_str_true) < 0)
629 goto fail;
630 if (IniFile_SetKeyValueString(ini, section_channels, key_channels_sound, bool_str_true) < 0)
631 goto fail;
632 if (IniFile_SetKeyValueString(ini, section_channels, key_channels_rdpdr, bool_str_true) < 0)
633 goto fail;
634 if (IniFile_SetKeyValueString(ini, section_channels, key_channels_video, bool_str_true) < 0)
635 goto fail;
636 if (IniFile_SetKeyValueString(ini, section_channels, key_channels_camera, bool_str_true) < 0)
637 goto fail;
638 if (IniFile_SetKeyValueString(ini, section_channels, key_channels_rails, bool_str_false) < 0)
639 goto fail;
640
641 if (IniFile_SetKeyValueString(ini, section_channels, key_channels_blacklist, bool_str_true) < 0)
642 goto fail;
643 if (IniFile_SetKeyValueString(ini, section_channels, key_channels_pass, "") < 0)
644 goto fail;
645 if (IniFile_SetKeyValueString(ini, section_channels, key_channels_intercept, "") < 0)
646 goto fail;
647
648 /* Input configuration */
649 if (IniFile_SetKeyValueString(ini, section_input, key_input_kbd, bool_str_true) < 0)
650 goto fail;
651 if (IniFile_SetKeyValueString(ini, section_input, key_input_mouse, bool_str_true) < 0)
652 goto fail;
653 if (IniFile_SetKeyValueString(ini, section_input, key_input_multitouch, bool_str_true) < 0)
654 goto fail;
655
656 /* Security settings */
657 if (IniFile_SetKeyValueString(ini, section_security, key_security_server_tls, bool_str_true) <
658 0)
659 goto fail;
660 if (IniFile_SetKeyValueString(ini, section_security, key_security_server_nla, bool_str_false) <
661 0)
662 goto fail;
663 if (IniFile_SetKeyValueString(ini, section_security, key_security_server_rdp, bool_str_true) <
664 0)
665 goto fail;
666
667 if (IniFile_SetKeyValueString(ini, section_security, key_security_client_tls, bool_str_true) <
668 0)
669 goto fail;
670 if (IniFile_SetKeyValueString(ini, section_security, key_security_client_nla, bool_str_true) <
671 0)
672 goto fail;
673 if (IniFile_SetKeyValueString(ini, section_security, key_security_client_rdp, bool_str_true) <
674 0)
675 goto fail;
676 if (IniFile_SetKeyValueString(ini, section_security, key_security_client_fallback,
677 bool_str_true) < 0)
678 goto fail;
679
680 /* Module configuration */
681 if (IniFile_SetKeyValueString(ini, section_plugins, key_plugins_modules,
682 "module1,module2,...") < 0)
683 goto fail;
684 if (IniFile_SetKeyValueString(ini, section_plugins, key_plugins_required,
685 "module1,module2,...") < 0)
686 goto fail;
687
688 /* Certificate configuration */
689 if (IniFile_SetKeyValueString(ini, section_certificates, key_cert_file,
690 "<absolute path to some certificate file> OR") < 0)
691 goto fail;
692 if (IniFile_SetKeyValueString(ini, section_certificates, key_cert_content,
693 "<Contents of some certificate file in PEM format>") < 0)
694 goto fail;
695
696 if (IniFile_SetKeyValueString(ini, section_certificates, key_private_key_file,
697 "<absolute path to some private key file> OR") < 0)
698 goto fail;
699 if (IniFile_SetKeyValueString(ini, section_certificates, key_private_key_content,
700 "<Contents of some private key file in PEM format>") < 0)
701 goto fail;
702
703 /* store configuration */
704 if (IniFile_WriteFile(ini, file) < 0)
705 goto fail;
706
707 rc = TRUE;
708
709fail:
710 IniFile_Free(ini);
711 return rc;
712}

◆ pf_server_config_free()

FREERDP_API void pf_server_config_free ( proxyConfig *  config)

pf_server_config_free Releases all resources associated with proxyConfig

Parameters
configA pointer to the proxyConfig to clean up. Might be NULL.

Definition at line 863 of file pf_config.c.

864{
865 if (config == NULL)
866 return;
867
868 free(config->Host);
869 free(config->TargetHost);
870 free(config->TargetUser);
871 free(config->TargetDomain);
872 free(config->TargetPassword);
873
874 CommandLineParserFree(config->Passthrough);
875 CommandLineParserFree(config->Intercept);
876 CommandLineParserFree(config->Modules);
877 CommandLineParserFree(config->RequiredPlugins);
878
879 free(config->CertificateFile);
880 zfree(config->CertificateContent);
881 znfree(config->CertificatePEM, config->CertificatePEMLength);
882 free(config->PrivateKeyFile);
883 zfree(config->PrivateKeyContent);
884 znfree(config->PrivateKeyPEM, config->PrivateKeyPEMLength);
885 IniFile_Free(config->ini);
886 free(config);
887}

Referenced by pf_config_clone(), and server_config_load_ini().

Here is the caller graph for this function:

◆ pf_server_config_load_buffer()

WINPR_ATTR_NODISCARD FREERDP_API proxyConfig * pf_server_config_load_buffer ( const char *  buffer)

pf_server_config_load_buffer Create a proxyConfig from a memory string buffer in INI file format

Parameters
bufferA pointer to the '\0' terminated INI string.
Returns
A proxyConfig or NULL in case of failure.

Definition at line 714 of file pf_config.c.

715{
716 proxyConfig* config = NULL;
717 wIniFile* ini = NULL;
718
719 ini = IniFile_New();
720
721 if (!ini)
722 {
723 WLog_ERR(TAG, "IniFile_New() failed!");
724 return NULL;
725 }
726
727 if (IniFile_ReadBuffer(ini, buffer) < 0)
728 {
729 WLog_ERR(TAG, "failed to parse ini: '%s'", buffer);
730 goto out;
731 }
732
733 config = server_config_load_ini(ini);
734out:
735 IniFile_Free(ini);
736 return config;
737}
proxyConfig * server_config_load_ini(wIniFile *ini)
server_config_load_ini Create a proxyConfig from a already loaded INI file.
Definition pf_config.c:551

References server_config_load_ini().

Here is the call graph for this function:

◆ pf_server_config_load_file()

WINPR_ATTR_NODISCARD FREERDP_API proxyConfig * pf_server_config_load_file ( const char *  path)

pf_server_config_load_file Create a proxyConfig from a INI file found at path.

Parameters
pathThe path of the INI file
Returns
A proxyConfig or NULL in case of failure.

Definition at line 739 of file pf_config.c.

740{
741 proxyConfig* config = NULL;
742 wIniFile* ini = IniFile_New();
743
744 if (!ini)
745 {
746 WLog_ERR(TAG, "IniFile_New() failed!");
747 return NULL;
748 }
749
750 if (IniFile_ReadFile(ini, path) < 0)
751 {
752 WLog_ERR(TAG, "failed to parse ini file: '%s'", path);
753 goto out;
754 }
755
756 config = server_config_load_ini(ini);
757out:
758 IniFile_Free(ini);
759 return config;
760}

References server_config_load_ini().

Here is the call graph for this function:

◆ pf_server_config_print()

FREERDP_API void pf_server_config_print ( const proxyConfig *  config)

pf_server_config_print Print the configuration to stdout

Parameters
configA pointer to the configuration to print. Must NOT be NULL.

Definition at line 769 of file pf_config.c.

770{
771 WINPR_ASSERT(config);
772 WLog_INFO(TAG, "Proxy configuration:");
773
774 CONFIG_PRINT_SECTION(section_server);
775 CONFIG_PRINT_STR(config, Host);
776 CONFIG_PRINT_UINT16(config, Port);
777
778 if (config->FixedTarget)
779 {
780 CONFIG_PRINT_SECTION(section_target);
781 CONFIG_PRINT_STR(config, TargetHost);
782 CONFIG_PRINT_UINT16(config, TargetPort);
783 CONFIG_PRINT_UINT32(config, TargetTlsSecLevel);
784
785 if (config->TargetUser)
786 CONFIG_PRINT_STR(config, TargetUser);
787 if (config->TargetDomain)
788 CONFIG_PRINT_STR(config, TargetDomain);
789 }
790
791 CONFIG_PRINT_SECTION(section_input);
792 CONFIG_PRINT_BOOL(config, Keyboard);
793 CONFIG_PRINT_BOOL(config, Mouse);
794 CONFIG_PRINT_BOOL(config, Multitouch);
795
796 CONFIG_PRINT_SECTION(section_security);
797 CONFIG_PRINT_BOOL(config, ServerNlaSecurity);
798 CONFIG_PRINT_BOOL(config, ServerTlsSecurity);
799 CONFIG_PRINT_BOOL(config, ServerRdpSecurity);
800 CONFIG_PRINT_BOOL(config, ClientNlaSecurity);
801 CONFIG_PRINT_BOOL(config, ClientTlsSecurity);
802 CONFIG_PRINT_BOOL(config, ClientRdpSecurity);
803 CONFIG_PRINT_BOOL(config, ClientAllowFallbackToTls);
804
805 CONFIG_PRINT_SECTION(section_channels);
806 CONFIG_PRINT_BOOL(config, GFX);
807 CONFIG_PRINT_BOOL(config, DisplayControl);
808 CONFIG_PRINT_BOOL(config, Clipboard);
809 CONFIG_PRINT_BOOL(config, AudioOutput);
810 CONFIG_PRINT_BOOL(config, AudioInput);
811 CONFIG_PRINT_BOOL(config, DeviceRedirection);
812 CONFIG_PRINT_BOOL(config, VideoRedirection);
813 CONFIG_PRINT_BOOL(config, CameraRedirection);
814 CONFIG_PRINT_BOOL(config, RemoteApp);
815 CONFIG_PRINT_BOOL(config, PassthroughIsBlacklist);
816
817 if (config->PassthroughCount)
818 {
819 WLog_INFO(TAG, "\tStatic Channels Proxy:");
820 pf_server_config_print_list(config->Passthrough, config->PassthroughCount);
821 }
822
823 if (config->InterceptCount)
824 {
825 WLog_INFO(TAG, "\tStatic Channels Proxy-Intercept:");
826 pf_server_config_print_list(config->Intercept, config->InterceptCount);
827 }
828
829 /* modules */
830 CONFIG_PRINT_SECTION_KEY(section_plugins, key_plugins_modules);
831 for (size_t x = 0; x < config->ModulesCount; x++)
832 CONFIG_PRINT_STR(config, Modules[x]);
833
834 /* Required plugins */
835 CONFIG_PRINT_SECTION_KEY(section_plugins, key_plugins_required);
836 for (size_t x = 0; x < config->RequiredPluginsCount; x++)
837 CONFIG_PRINT_STR(config, RequiredPlugins[x]);
838
839 CONFIG_PRINT_SECTION(section_certificates);
840 CONFIG_PRINT_STR(config, CertificateFile);
841 CONFIG_PRINT_STR_CONTENT(config, CertificateContent);
842 CONFIG_PRINT_STR(config, PrivateKeyFile);
843 CONFIG_PRINT_STR_CONTENT(config, PrivateKeyContent);
844}

◆ server_config_load_ini()

WINPR_ATTR_NODISCARD FREERDP_API proxyConfig * server_config_load_ini ( wIniFile *  ini)

server_config_load_ini Create a proxyConfig from a already loaded INI file.

Parameters
iniA pointer to the parsed INI file. Must NOT be NULL.
Returns
A proxyConfig or NULL in case of failure.

Definition at line 551 of file pf_config.c.

552{
553 proxyConfig* config = NULL;
554
555 WINPR_ASSERT(ini);
556
557 config = calloc(1, sizeof(proxyConfig));
558 if (config)
559 {
560 /* Set default values != 0 */
561 config->TargetTlsSecLevel = 1;
562
563 /* Load from ini */
564 if (!pf_config_load_server(ini, config))
565 goto out;
566
567 if (!pf_config_load_target(ini, config))
568 goto out;
569
570 if (!pf_config_load_channels(ini, config))
571 goto out;
572
573 if (!pf_config_load_input(ini, config))
574 goto out;
575
576 if (!pf_config_load_security(ini, config))
577 goto out;
578
579 if (!pf_config_load_modules(ini, config))
580 goto out;
581
582 if (!pf_config_load_certificates(ini, config))
583 goto out;
584 config->ini = IniFile_Clone(ini);
585 if (!config->ini)
586 goto out;
587 }
588 return config;
589out:
590 WINPR_PRAGMA_DIAG_PUSH
591 WINPR_PRAGMA_DIAG_IGNORED_MISMATCHED_DEALLOC
592 pf_server_config_free(config);
593 WINPR_PRAGMA_DIAG_POP
594
595 return NULL;
596}

References pf_server_config_free().

Referenced by pf_server_config_load_buffer(), and pf_server_config_load_file().

Here is the call graph for this function:
Here is the caller graph for this function: