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 token->Username = nullptr;
103 free(token->Domain);
104 token->Domain = nullptr;
105 return TRUE;
106}
107
108static HANDLE_OPS ops = { LogonUserIsHandled,
109 LogonUserCloseHandle,
110 LogonUserGetFd,
111 nullptr, /* CleanupHandle */
112 nullptr,
113 nullptr,
114 nullptr,
115 nullptr,
116 nullptr,
117 nullptr,
118 nullptr,
119 nullptr,
120 nullptr,
121 nullptr,
122 nullptr,
123 nullptr,
124 nullptr,
125 nullptr,
126 nullptr,
127 nullptr,
128 nullptr };
129
130BOOL LogonUserA(LPCSTR lpszUsername, LPCSTR lpszDomain, WINPR_ATTR_UNUSED LPCSTR lpszPassword,
131 WINPR_ATTR_UNUSED DWORD dwLogonType, WINPR_ATTR_UNUSED DWORD dwLogonProvider,
132 PHANDLE phToken)
133{
134 if (!lpszUsername)
135 return FALSE;
136
137 WINPR_ACCESS_TOKEN* token = (WINPR_ACCESS_TOKEN*)calloc(1, sizeof(WINPR_ACCESS_TOKEN));
138
139 if (!token)
140 return FALSE;
141
142 WINPR_HANDLE_SET_TYPE_AND_MODE(token, HANDLE_TYPE_ACCESS_TOKEN, WINPR_FD_READ);
143 token->common.ops = &ops;
144 token->Username = _strdup(lpszUsername);
145
146 if (!token->Username)
147 goto fail;
148
149 if (lpszDomain)
150 {
151 token->Domain = _strdup(lpszDomain);
152
153 if (!token->Domain)
154 goto fail;
155 }
156
157 {
158 long buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
159 if (buflen < 0)
160 buflen = 8196;
161
162 {
163 const size_t s = 1ULL + (size_t)buflen;
164 char* buf = (char*)calloc(s, sizeof(char));
165 if (!buf)
166 goto fail;
167
168 {
169 struct passwd pwd = WINPR_C_ARRAY_INIT;
170 struct passwd* pw = nullptr;
171 const int rc = getpwnam_r(lpszUsername, &pwd, buf,
172 WINPR_ASSERTING_INT_CAST(size_t, buflen), &pw);
173 free(buf);
174 if ((rc == 0) && pw)
175 {
176 token->UserId = (DWORD)pw->pw_uid;
177 token->GroupId = (DWORD)pw->pw_gid;
178 }
179
180 *((ULONG_PTR*)phToken) = (ULONG_PTR)token;
181 return TRUE;
182 }
183 }
184 }
185fail:
186 free(token->Username);
187 free(token->Domain);
188 free(token);
189 return FALSE;
190}
191
192BOOL LogonUserW(WINPR_ATTR_UNUSED LPCWSTR lpszUsername, WINPR_ATTR_UNUSED LPCWSTR lpszDomain,
193 WINPR_ATTR_UNUSED LPCWSTR lpszPassword, WINPR_ATTR_UNUSED DWORD dwLogonType,
194 WINPR_ATTR_UNUSED DWORD dwLogonProvider, WINPR_ATTR_UNUSED PHANDLE phToken)
195{
196 WLog_ERR("TODO", "TODO: implement");
197 return TRUE;
198}
199
200BOOL LogonUserExA(WINPR_ATTR_UNUSED LPCSTR lpszUsername, WINPR_ATTR_UNUSED LPCSTR lpszDomain,
201 WINPR_ATTR_UNUSED LPCSTR lpszPassword, WINPR_ATTR_UNUSED DWORD dwLogonType,
202 WINPR_ATTR_UNUSED DWORD dwLogonProvider, WINPR_ATTR_UNUSED PHANDLE phToken,
203 WINPR_ATTR_UNUSED PSID* ppLogonSid, WINPR_ATTR_UNUSED PVOID* ppProfileBuffer,
204 WINPR_ATTR_UNUSED LPDWORD pdwProfileLength,
205 WINPR_ATTR_UNUSED PQUOTA_LIMITS pQuotaLimits)
206{
207 WLog_ERR("TODO", "TODO: implement");
208 return TRUE;
209}
210
211BOOL LogonUserExW(WINPR_ATTR_UNUSED LPCWSTR lpszUsername, WINPR_ATTR_UNUSED LPCWSTR lpszDomain,
212 WINPR_ATTR_UNUSED LPCWSTR lpszPassword, WINPR_ATTR_UNUSED DWORD dwLogonType,
213 WINPR_ATTR_UNUSED DWORD dwLogonProvider, WINPR_ATTR_UNUSED PHANDLE phToken,
214 WINPR_ATTR_UNUSED PSID* ppLogonSid, WINPR_ATTR_UNUSED PVOID* ppProfileBuffer,
215 WINPR_ATTR_UNUSED LPDWORD pdwProfileLength,
216 WINPR_ATTR_UNUSED PQUOTA_LIMITS pQuotaLimits)
217{
218 WLog_ERR("TODO", "TODO: implement");
219 return TRUE;
220}
221
222BOOL GetUserNameExA(EXTENDED_NAME_FORMAT NameFormat, LPSTR lpNameBuffer, PULONG nSize)
223{
224 WINPR_ASSERT(lpNameBuffer);
225 WINPR_ASSERT(nSize);
226
227 switch (NameFormat)
228 {
229 case NameSamCompatible:
230#if defined(WINPR_HAVE_GETPWUID_R)
231 {
232 int rc = 0;
233 struct passwd pwd = WINPR_C_ARRAY_INIT;
234 struct passwd* result = nullptr;
235 uid_t uid = getuid();
236
237 rc = getpwuid_r(uid, &pwd, lpNameBuffer, *nSize, &result);
238 if (rc != 0)
239 return FALSE;
240 if (result == nullptr)
241 return FALSE;
242 }
243#elif defined(WINPR_HAVE_GETLOGIN_R)
244 if (getlogin_r(lpNameBuffer, *nSize) != 0)
245 return FALSE;
246#else
247 {
248 const char* name = getlogin();
249 if (!name)
250 return FALSE;
251 strncpy(lpNameBuffer, name, strnlen(name, *nSize));
252 }
253#endif
254 {
255 const size_t len = strnlen(lpNameBuffer, *nSize);
256 if (len > UINT32_MAX)
257 return FALSE;
258 *nSize = (ULONG)len;
259 }
260 return TRUE;
261
262 case NameFullyQualifiedDN:
263 case NameDisplay:
264 case NameUniqueId:
265 case NameCanonical:
266 case NameUserPrincipal:
267 case NameCanonicalEx:
268 case NameServicePrincipal:
269 case NameDnsDomain:
270 break;
271
272 default:
273 break;
274 }
275
276 return FALSE;
277}
278
279BOOL GetUserNameExW(EXTENDED_NAME_FORMAT NameFormat, LPWSTR lpNameBuffer, PULONG nSize)
280{
281 BOOL rc = FALSE;
282 char* name = nullptr;
283
284 WINPR_ASSERT(nSize);
285 WINPR_ASSERT(lpNameBuffer);
286
287 name = calloc(1, *nSize + 1);
288 if (!name)
289 goto fail;
290
291 if (!GetUserNameExA(NameFormat, name, nSize))
292 goto fail;
293
294 {
295 const SSIZE_T res = ConvertUtf8ToWChar(name, lpNameBuffer, *nSize);
296 if ((res < 0) || (res >= UINT32_MAX))
297 goto fail;
298
299 *nSize = (UINT32)res + 1;
300 }
301 rc = TRUE;
302fail:
303 free(name);
304 return rc;
305}
306
307#endif