VirtualBox

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

Last change on this file since 76553 was 76553, checked in by vboxsync, 6 years ago

scm --update-copyright-year

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

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette