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
 
FREERDP_API proxyConfig * server_config_load_ini (wIniFile *ini)
 server_config_load_ini Create a proxyConfig from a already loaded INI file.
 
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.
 
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 968 of file pf_config.c.

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

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 1326 of file pf_config.c.

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

◆ 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 909 of file pf_config.c.

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

◆ 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 903 of file pf_config.c.

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

◆ 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 1294 of file pf_config.c.

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

◆ 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 894 of file pf_config.c.

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

◆ 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 888 of file pf_config.c.

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

◆ 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 597 of file pf_config.c.

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

◆ 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 862 of file pf_config.c.

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

Referenced by pf_config_clone(), and server_config_load_ini().

Here is the caller graph for this function:

◆ pf_server_config_load_buffer()

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 713 of file pf_config.c.

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

References server_config_load_ini().

Here is the call graph for this function:

◆ pf_server_config_load_file()

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 738 of file pf_config.c.

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

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 768 of file pf_config.c.

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

◆ server_config_load_ini()

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 550 of file pf_config.c.

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

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: