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 = NULL;
44 PSTR UserName = NULL;
45 PWSTR TargetNameW = NULL;
46 PWSTR ServerHostNameW = NULL;
47 PWSTR ParsedUserNameW = NULL;
48 PWSTR ParsedDomainW = NULL;
49 PWSTR PasswordNullTerminatedW = NULL;
50 PCREDENTIALW Credential = { 0 };
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 _snprintf(TargetName, len, TERMSRV, ServerHostname);
74
75 TargetName[len - 1] = 0;
76
77 TargetNameW = ConvertUtf8ToWCharAlloc(TargetName, NULL);
78 if (!TargetNameW)
79 goto fail;
80
81 if (!CredReadW(TargetNameW, CRED_TYPE_GENERIC, 0, &Credential))
82 goto fail;
83
84 if (!bExistPassword)
85 {
86 const WCHAR* PasswordW =
87 ValidateString(Credential->CredentialBlob, Credential->CredentialBlobSize);
88
89 PasswordNullTerminatedW = (PWSTR)calloc(Credential->CredentialBlobSize + 1, sizeof(WCHAR));
90
91 if (!PasswordNullTerminatedW)
92 goto fail;
93
94 memcpy(PasswordNullTerminatedW, PasswordW, Credential->CredentialBlobSize * sizeof(WCHAR));
95
96 if (PasswordNullTerminatedW)
97 {
98 if (!freerdp_settings_set_string_from_utf16(settings, idPassword,
99 PasswordNullTerminatedW))
100 {
101 goto fail;
102 }
103 }
104 }
105
106 if (!bExistUserName)
107 {
108 const WCHAR* UserNameW = Credential->UserName;
109
110 if (UserNameW)
111 {
112 ParsedUserNameW = calloc(CREDUI_MAX_USERNAME_LENGTH + 1, sizeof(WCHAR));
113 if (!ParsedUserNameW)
114 goto fail;
115
116 ParsedDomainW = calloc(CREDUI_MAX_DOMAIN_TARGET_LENGTH + 1, sizeof(WCHAR));
117 if (!ParsedDomainW)
118 goto fail;
119
120 DWORD ParseResult =
121 CredUIParseUserNameW(UserNameW, ParsedUserNameW, CREDUI_MAX_USERNAME_LENGTH + 1,
122 ParsedDomainW, CREDUI_MAX_DOMAIN_TARGET_LENGTH + 1);
123
124 if (ParseResult == NO_ERROR)
125 {
126 if (!freerdp_settings_set_string_from_utf16(settings, idUsername, ParsedUserNameW))
127 goto fail;
128
129 if (*ParsedDomainW != 0)
130 {
131 if (!freerdp_settings_set_string_from_utf16(settings, idDomain, ParsedDomainW))
132 goto fail;
133 }
134 }
135 else if (ParseResult == ERROR_INVALID_ACCOUNT_NAME)
136 {
137 if (!freerdp_settings_set_string_from_utf16(settings, idUsername, UserNameW))
138 goto fail;
139 }
140 }
141 }
142
143fail:
144 if (Credential)
145 {
146 CredFree(Credential);
147 }
148 free(TargetName);
149 free(UserName);
150 free(TargetNameW);
151 free(ServerHostNameW);
152 free(ParsedUserNameW);
153 free(ParsedDomainW);
154 free(PasswordNullTerminatedW);
155 return;
156}
157
158void WINAPI AddDefaultSettings(rdpSettings* settings)
159{
160 AddDefaultSettings_I(settings, FreeRDP_ServerHostname, FreeRDP_Username, FreeRDP_Domain,
161 FreeRDP_Password);
162 AddDefaultSettings_I(settings, FreeRDP_GatewayHostname, FreeRDP_GatewayUsername,
163 FreeRDP_GatewayDomain, FreeRDP_GatewayPassword);
164}
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.