FreeRDP
Loading...
Searching...
No Matches
wf_defaults.c
1
19#include <windows.h>
20#include <wincred.h>
21#include <stdio.h>
22#include <malloc.h>
23#include <freerdp/settings.h>
24
25#include "wf_defaults.h"
26
27static PCWSTR ValidateString(const BYTE* pb, ULONG cb)
28{
29 if (!pb || !cb)
30 return 0;
31
32 if (cb % sizeof(WCHAR) != 0)
33 return 0;
34
35 return (PCWSTR)pb;
36}
37
38static void AddDefaultSettings_I(rdpSettings* settings, size_t idHostname, size_t idUsername,
39 size_t idDomain, size_t idPassword)
40{
41 static const PSTR TERMSRV = "TERMSRV/%s";
42
43 PSTR TargetName = nullptr;
44 PSTR UserName = nullptr;
45 PWSTR TargetNameW = nullptr;
46 PWSTR ServerHostNameW = nullptr;
47 PWSTR ParsedUserNameW = nullptr;
48 PWSTR ParsedDomainW = nullptr;
49 PWSTR PasswordNullTerminatedW = nullptr;
50 PCREDENTIALW Credential = WINPR_C_ARRAY_INIT;
51
52 PCSTR ServerHostname = freerdp_settings_get_string(settings, idHostname);
53
54 if (!ServerHostname)
55 return;
56
57 BOOL bExistUserName = freerdp_settings_get_string(settings, idUsername) != 0;
58 BOOL bExistPassword = freerdp_settings_get_string(settings, idPassword) != 0;
59
60 if (bExistUserName && bExistPassword)
61 return;
62
63 int len = _snprintf(TargetName, 0, TERMSRV, ServerHostname);
64 if (len < 0)
65 goto fail;
66
67 len++;
68 TargetName = (PSTR)malloc(len);
69
70 if (!TargetName)
71 goto fail;
72
73 const int rlen = _snprintf(TargetName, len, TERMSRV, ServerHostname);
74 if (rlen < 0)
75 goto fail;
76
77 TargetName[len - 1] = 0;
78
79 TargetNameW = ConvertUtf8ToWCharAlloc(TargetName, nullptr);
80 if (!TargetNameW)
81 goto fail;
82
83 if (!CredReadW(TargetNameW, CRED_TYPE_GENERIC, 0, &Credential))
84 goto fail;
85
86 if (!bExistPassword)
87 {
88 const WCHAR* PasswordW =
89 ValidateString(Credential->CredentialBlob, Credential->CredentialBlobSize);
90
91 PasswordNullTerminatedW = (PWSTR)calloc(Credential->CredentialBlobSize + 1, sizeof(WCHAR));
92
93 if (!PasswordNullTerminatedW)
94 goto fail;
95
96 memcpy(PasswordNullTerminatedW, PasswordW, Credential->CredentialBlobSize * sizeof(WCHAR));
97
98 if (PasswordNullTerminatedW)
99 {
100 if (!freerdp_settings_set_string_from_utf16(settings, idPassword,
101 PasswordNullTerminatedW))
102 {
103 goto fail;
104 }
105 }
106 }
107
108 if (!bExistUserName)
109 {
110 const WCHAR* UserNameW = Credential->UserName;
111
112 if (UserNameW)
113 {
114 ParsedUserNameW = calloc(CREDUI_MAX_USERNAME_LENGTH + 1, sizeof(WCHAR));
115 if (!ParsedUserNameW)
116 goto fail;
117
118 ParsedDomainW = calloc(CREDUI_MAX_DOMAIN_TARGET_LENGTH + 1, sizeof(WCHAR));
119 if (!ParsedDomainW)
120 goto fail;
121
122 DWORD ParseResult =
123 CredUIParseUserNameW(UserNameW, ParsedUserNameW, CREDUI_MAX_USERNAME_LENGTH + 1,
124 ParsedDomainW, CREDUI_MAX_DOMAIN_TARGET_LENGTH + 1);
125
126 if (ParseResult == NO_ERROR)
127 {
128 if (!freerdp_settings_set_string_from_utf16(settings, idUsername, ParsedUserNameW))
129 goto fail;
130
131 if (*ParsedDomainW != 0)
132 {
133 if (!freerdp_settings_set_string_from_utf16(settings, idDomain, ParsedDomainW))
134 goto fail;
135 }
136 }
137 else if (ParseResult == ERROR_INVALID_ACCOUNT_NAME)
138 {
139 if (!freerdp_settings_set_string_from_utf16(settings, idUsername, UserNameW))
140 goto fail;
141 }
142 }
143 }
144
145fail:
146 if (Credential)
147 {
148 CredFree(Credential);
149 }
150 free(TargetName);
151 free(UserName);
152 free(TargetNameW);
153 free(ServerHostNameW);
154 free(ParsedUserNameW);
155 free(ParsedDomainW);
156 free(PasswordNullTerminatedW);
157 return;
158}
159
160void WINAPI AddDefaultSettings(rdpSettings* settings)
161{
162 AddDefaultSettings_I(settings, FreeRDP_ServerHostname, FreeRDP_Username, FreeRDP_Domain,
163 FreeRDP_Password);
164 AddDefaultSettings_I(settings, FreeRDP_GatewayHostname, FreeRDP_GatewayUsername,
165 FreeRDP_GatewayDomain, FreeRDP_GatewayPassword);
166}
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.
WINPR_ATTR_NODISCARD 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.