VirtualBox

source: vbox/trunk/src/VBox/HostServices/auth/winlogon/winlogon.cpp

Last change on this file was 99739, checked in by vboxsync, 13 months ago

*: doxygen corrections (mostly about removing @returns from functions returning void).

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.7 KB
Line 
1/* $Id: winlogon.cpp 99739 2023-05-11 01:01:08Z vboxsync $ */
2/** @file
3 * VirtualBox External Authentication Library - Windows Logon Authentication.
4 */
5
6/*
7 * Copyright (C) 2006-2023 Oracle and/or its affiliates.
8 *
9 * This file is part of VirtualBox base platform packages, as
10 * available from https://www.virtualbox.org.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation, in version 3 of the
15 * License.
16 *
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, see <https://www.gnu.org/licenses>.
24 *
25 * SPDX-License-Identifier: GPL-3.0-only
26 */
27
28/* If defined, debug messages will be written to the debugger. */
29// #define AUTH_DEBUG
30
31#include <iprt/win/windows.h>
32#include <VBox/VBoxAuth.h>
33#include <iprt/cdefs.h>
34
35#ifdef AUTH_DEBUG
36# include <stdio.h>
37
38static void dprintfw(const WCHAR *fmt, ...)
39{
40 va_list va;
41 va_start(va, fmt);
42
43 WCHAR buffer[1024];
44
45 _vsnwprintf(buffer, sizeof (buffer), fmt, va);
46
47 OutputDebugStringW(buffer);
48
49 va_end(va);
50}
51# define DBGAUTH(a) dprintfw a
52#else
53# define DBGAUTH(a)
54#endif
55
56static WCHAR g_wszEmpty[] = { L"" };
57
58static void freeWideChar(WCHAR *pwszString)
59{
60 if (pwszString && pwszString != &g_wszEmpty[0])
61 {
62 size_t cb = (wcslen(pwszString) + 1) * sizeof(WCHAR);
63 SecureZeroMemory(pwszString, cb);
64 free(pwszString);
65 }
66}
67
68static WCHAR *utf8ToWideChar(const char *pszString)
69{
70 /*
71 * Shortcut for empty strings.
72 */
73 if (!pszString || *pszString == 0)
74 return &g_wszEmpty[0];
75
76 /*
77 * Return NULL on errors.
78 */
79 WCHAR *pwszString = NULL;
80
81 /*
82 * First calc result string length.
83 */
84 const DWORD dwFlags = MB_ERR_INVALID_CHARS;
85 int cwc = MultiByteToWideChar(CP_UTF8, dwFlags, pszString, -1, NULL, 0);
86 if (cwc > 0)
87 {
88 /*
89 * Alloc space for result buffer.
90 */
91 pwszString = (WCHAR *)malloc(cwc * sizeof(WCHAR));
92 if (pwszString)
93 {
94 /*
95 * Do the translation.
96 */
97 if (MultiByteToWideChar(CP_UTF8, dwFlags, pszString, -1, pwszString, cwc) <= 0)
98 {
99 /* translation error */
100 free(pwszString);
101 pwszString = NULL;
102 }
103 }
104 }
105
106 return pwszString;
107}
108
109/* Prototype it to make sure we've got the right prototype. */
110#if defined(_MSC_VER)
111extern "C" __declspec(dllexport) FNAUTHENTRY3 AuthEntry;
112#else
113extern "C" FNAUTHENTRY3 AuthEntry;
114#endif
115
116/**
117 * @callback_method_impl{FNAUTHENTRY3}
118 */
119extern "C" DECLEXPORT(AuthResult) AUTHCALL
120AuthEntry(const char *pszCaller,
121 PAUTHUUID pUuid,
122 AuthGuestJudgement guestJudgement,
123 const char *pszUser,
124 const char *pszPassword,
125 const char *pszDomain,
126 int fLogon,
127 unsigned clientId)
128{
129 RT_NOREF4(pszCaller, pUuid, guestJudgement, clientId);
130 if (!fLogon)
131 {
132 /* Nothing to cleanup. The return code does not matter. */
133 return AuthResultAccessDenied;
134 }
135
136 LPWSTR pwszUsername = utf8ToWideChar(pszUser);
137 LPWSTR pwszDomain = utf8ToWideChar(pszDomain);
138 LPWSTR pwszPassword = utf8ToWideChar(pszPassword);
139
140 DBGAUTH((L"u[%ls], d[%ls], p[%ls]\n", lpwszUsername, lpwszDomain, lpwszPassword));
141
142 AuthResult result = AuthResultAccessDenied;
143
144 if (pwszUsername && pwszDomain && pwszPassword)
145 {
146 /* LOGON32_LOGON_INTERACTIVE is intended for users who will be interactively using the computer,
147 * such as a user being logged on by a terminal server, remote shell, or similar process.
148 */
149 DWORD dwLogonType = LOGON32_LOGON_INTERACTIVE;
150 DWORD dwLogonProvider = LOGON32_PROVIDER_DEFAULT;
151
152 HANDLE hToken;
153
154 BOOL fSuccess = LogonUserW(pwszUsername,
155 pwszDomain,
156 pwszPassword,
157 dwLogonType,
158 dwLogonProvider,
159 &hToken);
160
161 if (fSuccess)
162 {
163 DBGAUTH((L"LogonUser success. hToken = %p\n", hToken));
164
165 result = AuthResultAccessGranted;
166
167 CloseHandle(hToken);
168 }
169 else
170 {
171 DBGAUTH((L"LogonUser failed %08X\n", GetLastError()));
172 }
173 }
174
175 freeWideChar(pwszUsername);
176 freeWideChar(pwszDomain);
177 freeWideChar(pwszPassword);
178
179 return result;
180}
181
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use