FreeRDP
Loading...
Searching...
No Matches
sspicli.c
1
20#include <winpr/config.h>
21
22#include <winpr/assert.h>
23#include <winpr/sspicli.h>
24
54#ifndef _WIN32
55
56#include <winpr/crt.h>
57
58#ifdef WINPR_HAVE_UNISTD_H
59#include <unistd.h>
60#endif
61
62#if defined(WINPR_HAVE_GETPWUID_R)
63#include <sys/types.h>
64#endif
65
66#include <pthread.h>
67
68#include <pwd.h>
69#include <grp.h>
70
71#include "../handle/handle.h"
72
73#include "../security/security.h"
74
75static BOOL LogonUserCloseHandle(HANDLE handle);
76
77static BOOL LogonUserIsHandled(HANDLE handle)
78{
79 return WINPR_HANDLE_IS_HANDLED(handle, HANDLE_TYPE_ACCESS_TOKEN, FALSE);
80}
81
82static int LogonUserGetFd(HANDLE handle)
83{
84 WINPR_ACCESS_TOKEN* pLogonUser = (WINPR_ACCESS_TOKEN*)handle;
85
86 if (!LogonUserIsHandled(handle))
87 return -1;
88
89 /* TODO: File fd not supported */
90 (void)pLogonUser;
91 return -1;
92}
93
94BOOL LogonUserCloseHandle(HANDLE handle)
95{
96 WINPR_ACCESS_TOKEN* token = (WINPR_ACCESS_TOKEN*)handle;
97
98 if (!handle || !LogonUserIsHandled(handle))
99 return FALSE;
100
101 free(token->Username);
102 free(token->Domain);
103 free(token);
104 return TRUE;
105}
106
107static HANDLE_OPS ops = { LogonUserIsHandled,
108 LogonUserCloseHandle,
109 LogonUserGetFd,
110 NULL, /* CleanupHandle */
111 NULL,
112 NULL,
113 NULL,
114 NULL,
115 NULL,
116 NULL,
117 NULL,
118 NULL,
119 NULL,
120 NULL,
121 NULL,
122 NULL,
123 NULL,
124 NULL,
125 NULL,
126 NULL,
127 NULL };
128
129BOOL LogonUserA(LPCSTR lpszUsername, LPCSTR lpszDomain, WINPR_ATTR_UNUSED LPCSTR lpszPassword,
130 WINPR_ATTR_UNUSED DWORD dwLogonType, WINPR_ATTR_UNUSED DWORD dwLogonProvider,
131 PHANDLE phToken)
132{
133 if (!lpszUsername)
134 return FALSE;
135
136 WINPR_ACCESS_TOKEN* token = (WINPR_ACCESS_TOKEN*)calloc(1, sizeof(WINPR_ACCESS_TOKEN));
137
138 if (!token)
139 return FALSE;
140
141 WINPR_HANDLE_SET_TYPE_AND_MODE(token, HANDLE_TYPE_ACCESS_TOKEN, WINPR_FD_READ);
142 token->common.ops = &ops;
143 token->Username = _strdup(lpszUsername);
144
145 if (!token->Username)
146 goto fail;
147
148 if (lpszDomain)
149 {
150 token->Domain = _strdup(lpszDomain);
151
152 if (!token->Domain)
153 goto fail;
154 }
155
156 {
157 long buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
158 if (buflen < 0)
159 buflen = 8196;
160
161 {
162 const size_t s = 1ULL + (size_t)buflen;
163 char* buf = (char*)calloc(s, sizeof(char));
164 if (!buf)
165 goto fail;
166
167 {
168 struct passwd pwd = { 0 };
169 struct passwd* pw = NULL;
170 const int rc = getpwnam_r(lpszUsername, &pwd, buf,
171 WINPR_ASSERTING_INT_CAST(size_t, buflen), &pw);
172 free(buf);
173 if ((rc == 0) && pw)
174 {
175 token->UserId = (DWORD)pw->pw_uid;
176 token->GroupId = (DWORD)pw->pw_gid;
177 }
178
179 *((ULONG_PTR*)phToken) = (ULONG_PTR)token;
180 return TRUE;
181 }
182 }
183 }
184fail:
185 free(token->Username);
186 free(token->Domain);
187 free(token);
188 return FALSE;
189}
190
191BOOL LogonUserW(WINPR_ATTR_UNUSED LPCWSTR lpszUsername, WINPR_ATTR_UNUSED LPCWSTR lpszDomain,
192 WINPR_ATTR_UNUSED LPCWSTR lpszPassword, WINPR_ATTR_UNUSED DWORD dwLogonType,
193 WINPR_ATTR_UNUSED DWORD dwLogonProvider, WINPR_ATTR_UNUSED PHANDLE phToken)
194{
195 WLog_ERR("TODO", "TODO: implement");
196 return TRUE;
197}
198
199BOOL LogonUserExA(WINPR_ATTR_UNUSED LPCSTR lpszUsername, WINPR_ATTR_UNUSED LPCSTR lpszDomain,
200 WINPR_ATTR_UNUSED LPCSTR lpszPassword, WINPR_ATTR_UNUSED DWORD dwLogonType,
201 WINPR_ATTR_UNUSED DWORD dwLogonProvider, WINPR_ATTR_UNUSED PHANDLE phToken,
202 WINPR_ATTR_UNUSED PSID* ppLogonSid, WINPR_ATTR_UNUSED PVOID* ppProfileBuffer,
203 WINPR_ATTR_UNUSED LPDWORD pdwProfileLength,
204 WINPR_ATTR_UNUSED PQUOTA_LIMITS pQuotaLimits)
205{
206 WLog_ERR("TODO", "TODO: implement");
207 return TRUE;
208}
209
210BOOL LogonUserExW(WINPR_ATTR_UNUSED LPCWSTR lpszUsername, WINPR_ATTR_UNUSED LPCWSTR lpszDomain,
211 WINPR_ATTR_UNUSED LPCWSTR lpszPassword, WINPR_ATTR_UNUSED DWORD dwLogonType,
212 WINPR_ATTR_UNUSED DWORD dwLogonProvider, WINPR_ATTR_UNUSED PHANDLE phToken,
213 WINPR_ATTR_UNUSED PSID* ppLogonSid, WINPR_ATTR_UNUSED PVOID* ppProfileBuffer,
214 WINPR_ATTR_UNUSED LPDWORD pdwProfileLength,
215 WINPR_ATTR_UNUSED PQUOTA_LIMITS pQuotaLimits)
216{
217 WLog_ERR("TODO", "TODO: implement");
218 return TRUE;
219}
220
221BOOL GetUserNameExA(EXTENDED_NAME_FORMAT NameFormat, LPSTR lpNameBuffer, PULONG nSize)
222{
223 WINPR_ASSERT(lpNameBuffer);
224 WINPR_ASSERT(nSize);
225
226 switch (NameFormat)
227 {
228 case NameSamCompatible:
229#if defined(WINPR_HAVE_GETPWUID_R)
230 {
231 int rc = 0;
232 struct passwd pwd = { 0 };
233 struct passwd* result = NULL;
234 uid_t uid = getuid();
235
236 rc = getpwuid_r(uid, &pwd, lpNameBuffer, *nSize, &result);
237 if (rc != 0)
238 return FALSE;
239 if (result == NULL)
240 return FALSE;
241 }
242#elif defined(WINPR_HAVE_GETLOGIN_R)
243 if (getlogin_r(lpNameBuffer, *nSize) != 0)
244 return FALSE;
245#else
246 {
247 const char* name = getlogin();
248 if (!name)
249 return FALSE;
250 strncpy(lpNameBuffer, name, strnlen(name, *nSize));
251 }
252#endif
253 {
254 const size_t len = strnlen(lpNameBuffer, *nSize);
255 if (len > UINT32_MAX)
256 return FALSE;
257 *nSize = (ULONG)len;
258 }
259 return TRUE;
260
261 case NameFullyQualifiedDN:
262 case NameDisplay:
263 case NameUniqueId:
264 case NameCanonical:
265 case NameUserPrincipal:
266 case NameCanonicalEx:
267 case NameServicePrincipal:
268 case NameDnsDomain:
269 break;
270
271 default:
272 break;
273 }
274
275 return FALSE;
276}
277
278BOOL GetUserNameExW(EXTENDED_NAME_FORMAT NameFormat, LPWSTR lpNameBuffer, PULONG nSize)
279{
280 BOOL rc = FALSE;
281 char* name = NULL;
282
283 WINPR_ASSERT(nSize);
284 WINPR_ASSERT(lpNameBuffer);
285
286 name = calloc(1, *nSize + 1);
287 if (!name)
288 goto fail;
289
290 if (!GetUserNameExA(NameFormat, name, nSize))
291 goto fail;
292
293 {
294 const SSIZE_T res = ConvertUtf8ToWChar(name, lpNameBuffer, *nSize);
295 if ((res < 0) || (res >= UINT32_MAX))
296 goto fail;
297
298 *nSize = (UINT32)res + 1;
299 }
300 rc = TRUE;
301fail:
302 free(name);
303 return rc;
304}
305
306#endif