23#include <freerdp/settings.h>
25#include "wf_defaults.h"
27static PCWSTR ValidateString(
const BYTE* pb, ULONG cb)
32 if (cb %
sizeof(WCHAR) != 0)
38static void AddDefaultSettings_I(rdpSettings* settings,
size_t idHostname,
size_t idUsername,
39 size_t idDomain,
size_t idPassword)
41 static const PSTR TERMSRV =
"TERMSRV/%s";
43 PSTR TargetName = NULL;
45 PWSTR TargetNameW = NULL;
46 PWSTR ServerHostNameW = NULL;
47 PWSTR ParsedUserNameW = NULL;
48 PWSTR ParsedDomainW = NULL;
49 PWSTR PasswordNullTerminatedW = NULL;
60 if (bExistUserName && bExistPassword)
63 int len = _snprintf(TargetName, 0, TERMSRV, ServerHostname);
68 TargetName = (PSTR)malloc(len);
73 _snprintf(TargetName, len, TERMSRV, ServerHostname);
75 TargetName[len - 1] = 0;
77 TargetNameW = ConvertUtf8ToWCharAlloc(TargetName, NULL);
81 if (!CredReadW(TargetNameW, CRED_TYPE_GENERIC, 0, &Credential))
86 const WCHAR* PasswordW =
87 ValidateString(Credential->CredentialBlob, Credential->CredentialBlobSize);
89 PasswordNullTerminatedW = (PWSTR)calloc(Credential->CredentialBlobSize + 1,
sizeof(WCHAR));
91 if (!PasswordNullTerminatedW)
94 memcpy(PasswordNullTerminatedW, PasswordW, Credential->CredentialBlobSize *
sizeof(WCHAR));
96 if (PasswordNullTerminatedW)
99 PasswordNullTerminatedW))
108 const WCHAR* UserNameW = Credential->UserName;
112 ParsedUserNameW = calloc(CREDUI_MAX_USERNAME_LENGTH + 1,
sizeof(WCHAR));
113 if (!ParsedUserNameW)
116 ParsedDomainW = calloc(CREDUI_MAX_DOMAIN_TARGET_LENGTH + 1,
sizeof(WCHAR));
121 CredUIParseUserNameW(UserNameW, ParsedUserNameW, CREDUI_MAX_USERNAME_LENGTH + 1,
122 ParsedDomainW, CREDUI_MAX_DOMAIN_TARGET_LENGTH + 1);
124 if (ParseResult == NO_ERROR)
129 if (*ParsedDomainW != 0)
135 else if (ParseResult == ERROR_INVALID_ACCOUNT_NAME)
146 CredFree(Credential);
151 free(ServerHostNameW);
152 free(ParsedUserNameW);
154 free(PasswordNullTerminatedW);
158void WINAPI AddDefaultSettings(rdpSettings* settings)
160 AddDefaultSettings_I(settings, FreeRDP_ServerHostname, FreeRDP_Username, FreeRDP_Domain,
162 AddDefaultSettings_I(settings, FreeRDP_GatewayHostname, FreeRDP_GatewayUsername,
163 FreeRDP_GatewayDomain, FreeRDP_GatewayPassword);
WINPR_ATTR_NODISCARD FREERDP_API const char * freerdp_settings_get_string(const rdpSettings *settings, FreeRDP_Settings_Keys_String id)
Returns a immutable string settings value.
FREERDP_API BOOL freerdp_settings_set_string_from_utf16(rdpSettings *settings, FreeRDP_Settings_Keys_String id, const WCHAR *param)
Sets a string settings value. The param is converted to UTF-8 and the copy stored.