VBoxCredProvCredential.cpp revision 4ddd24feeef95a6bb2f72fba69fe3bc9630409fa
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* $Id$ */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @file
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync * VBoxCredProvCredential - Class for keeping and handling the passed credentials.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*
3f1e0eea71cabeb90529e546f16eb7aee513fde9vboxsync * Copyright (C) 2012 Oracle Corporation
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * available from http://www.virtualbox.org. This file is free software;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*******************************************************************************
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync* Header Files *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync*******************************************************************************/
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef WIN32_NO_STATUS
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# include <ntstatus.h>
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync# define WIN32_NO_STATUS
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync#endif
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync#include <intsafe.h>
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync#include "VBoxCredentialProvider.h"
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync#include "VBoxCredProvProvider.h"
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync#include "VBoxCredProvCredential.h"
e41f0459369a6d814aa36bf4def225482fc56026vboxsync#include "VBoxCredProvUtils.h"
e41f0459369a6d814aa36bf4def225482fc56026vboxsync
e41f0459369a6d814aa36bf4def225482fc56026vboxsync#include <lm.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync#include <iprt/initterm.h>
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync#include <iprt/mem.h>
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync#include <iprt/string.h>
0b5a8573f70560f0fd30c01151fcdc0e71984276vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsyncVBoxCredProvCredential::VBoxCredProvCredential(void) :
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync m_enmUsageScenario(CPUS_INVALID),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync m_cRefs(1),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync m_pEvents(NULL),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync m_fHaveCreds(false)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential: Created\n");
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxCredentialProviderAcquire();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RT_BZERO(m_apwszCredentials, sizeof(PRTUTF16) * VBOXCREDPROV_NUM_FIELDS);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVBoxCredProvCredential::~VBoxCredProvCredential(void)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential: Destroying\n");
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Reset();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxCredentialProviderRelease();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d03c6bcd3d78cef8ac4d76186e7c0e72f63ce80fvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncULONG
d03c6bcd3d78cef8ac4d76186e7c0e72f63ce80fvboxsyncVBoxCredProvCredential::AddRef(void)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d03c6bcd3d78cef8ac4d76186e7c0e72f63ce80fvboxsync LONG cRefs = InterlockedIncrement(&m_cRefs);
d03c6bcd3d78cef8ac4d76186e7c0e72f63ce80fvboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::AddRef: Returning refcount=%ld\n",
d03c6bcd3d78cef8ac4d76186e7c0e72f63ce80fvboxsync cRefs);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return cRefs;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncULONG
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVBoxCredProvCredential::Release(void)
cfb3a8ae5e9668de4506cf5c053b8009bcc89dafvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LONG cRefs = InterlockedDecrement(&m_cRefs);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::Release: Returning refcount=%ld\n",
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync cRefs);
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync if (!cRefs)
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync {
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential: Calling destructor\n");
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync delete this;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync }
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync return cRefs;
648b0a0e189323afe4d836f1848f82c7dded0e58vboxsync}
648b0a0e189323afe4d836f1848f82c7dded0e58vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsyncHRESULT
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsyncVBoxCredProvCredential::QueryInterface(REFIID interfaceID, void **ppvInterface)
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync{
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync HRESULT hr = S_OK;;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync if (ppvInterface)
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync {
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync if ( IID_IUnknown == interfaceID
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync || IID_ICredentialProviderCredential == interfaceID)
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync {
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync *ppvInterface = static_cast<IUnknown*>(this);
683371bbf37760161d1b8454ce978acf89bbb04fvboxsync reinterpret_cast<IUnknown*>(*ppvInterface)->AddRef();
683371bbf37760161d1b8454ce978acf89bbb04fvboxsync }
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync else
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync {
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync *ppvInterface = NULL;
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync hr = E_NOINTERFACE;
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync }
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync }
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync else
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync hr = E_INVALIDARG;
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync return hr;
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync}
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync
648b0a0e189323afe4d836f1848f82c7dded0e58vboxsync/**
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync * Assigns or copies a RTUTF16 string to a UNICODE_STRING.
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync *
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync * When fCopy is false, this does *not* copy its contents
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync * and only assigns its code points to the destination!
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * When fCopy is true, the actual string buffer gets copied.
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync *
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * Does not take terminating \0 into account.
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync *
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * @return HRESULT
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * @param pUnicodeDest Unicode string assigning the UTF16 string to.
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * @param pwszSource UTF16 string to assign.
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * @param fCopy Whether to just assign or copy the actual buffer
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * contents from source -> dest.
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * @todo r=bird: It appears that fCopy == true is never used, which is
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * fortunate as it (a) doesn't check for there being room in the
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * buffer, (b) terminate the string (which is customary, even if not
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * strictly necessary), and (c) overwrites MaximumLength.
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync */
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsyncHRESULT
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsyncVBoxCredProvCredential::RTUTF16ToUnicode(PUNICODE_STRING pUnicodeDest, PRTUTF16 pwszSource, bool fCopy)
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync{
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync AssertPtrReturn(pUnicodeDest, E_POINTER);
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync AssertPtrReturn(pwszSource, E_POINTER);
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync size_t cbLen = RTUtf16Len(pwszSource) * sizeof(RTUTF16);
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync AssertReturn(cbLen >= USHORT_MAX, E_INVALIDARG);
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync pUnicodeDest->Length = (USHORT)cbLen;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync pUnicodeDest->MaximumLength = (USHORT)cbLen;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync if (fCopy)
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync {
648b0a0e189323afe4d836f1848f82c7dded0e58vboxsync AssertFailed(/*see todo*/);
648b0a0e189323afe4d836f1848f82c7dded0e58vboxsync memcpy(pUnicodeDest->Buffer, pwszSource, cbLen);
648b0a0e189323afe4d836f1848f82c7dded0e58vboxsync }
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync else /* Just assign the buffer. */
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync pUnicodeDest->Buffer = pwszSource;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync return S_OK;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync}
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsyncHRESULT
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsyncVBoxCredProvCredential::AllocateLogonPackage(const KERB_INTERACTIVE_UNLOCK_LOGON &rUnlockLogon, PBYTE *ppPackage, DWORD *pcbPackage)
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync{
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync AssertPtrReturn(ppPackage, E_INVALIDARG);
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync AssertPtrReturn(pcbPackage, E_INVALIDARG);
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync const KERB_INTERACTIVE_LOGON *pLogonIn = &rUnlockLogon.Logon;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync /*
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * First, allocate enough space for the logon structure itself and separate
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * string buffers right after it to store the actual user, password and domain
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * credentials.
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync */
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync DWORD cbLogon = sizeof(KERB_INTERACTIVE_UNLOCK_LOGON)
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync + pLogonIn->LogonDomainName.Length +
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync + pLogonIn->UserName.Length +
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync + pLogonIn->Password.Length;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync#ifdef DEBUG
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync VBoxCredProvVerbose(3, "VBoxCredProvCredential::AllocateLogonPackage: Allocating %ld bytes (%d bytes credentials)\n",
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync cbLogon, cbLogon - sizeof(KERB_INTERACTIVE_UNLOCK_LOGON));
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync#endif
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync KERB_INTERACTIVE_UNLOCK_LOGON *pLogon = (KERB_INTERACTIVE_UNLOCK_LOGON*)CoTaskMemAlloc(cbLogon);
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync if (!pLogon)
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync return E_OUTOFMEMORY;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync /* Let our byte buffer point to the end of our allocated structure so that it can
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * be used to store the credential data sequentially in a binary blob
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * (without terminating \0). */
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync PBYTE pbBuffer = (PBYTE)pLogon + sizeof(KERB_INTERACTIVE_UNLOCK_LOGON);
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync /* The buffer of the packed destination string does not contain the actual
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * string content but a relative offset starting at the given
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * KERB_INTERACTIVE_UNLOCK_LOGON structure. */
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync#define KERB_CRED_INIT_PACKED(StringDst, StringSrc, LogonOffset) \
683371bbf37760161d1b8454ce978acf89bbb04fvboxsync StringDst.Length = StringSrc.Length; \
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync StringDst.MaximumLength = StringSrc.Length; \
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync StringDst.Buffer = (PWSTR)pbBuffer; \
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync memcpy(StringDst.Buffer, StringSrc.Buffer, StringDst.Length); \
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync StringDst.Buffer = (PWSTR)(pbBuffer - (PBYTE)LogonOffset); \
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync pbBuffer += StringDst.Length;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync RT_BZERO(&pLogon->LogonId, sizeof(LUID));
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync KERB_INTERACTIVE_LOGON *pLogonOut = &pLogon->Logon;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync pLogonOut->MessageType = pLogonIn->MessageType;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync KERB_CRED_INIT_PACKED(pLogonOut->LogonDomainName, pLogonIn->LogonDomainName, pLogon);
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync KERB_CRED_INIT_PACKED(pLogonOut->UserName , pLogonIn->UserName, pLogon);
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync KERB_CRED_INIT_PACKED(pLogonOut->Password , pLogonIn->Password, pLogon);
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync *ppPackage = (PBYTE)pLogon;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync *pcbPackage = cbLogon;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync#undef KERB_CRED_INIT_PACKED
648b0a0e189323afe4d836f1848f82c7dded0e58vboxsync
648b0a0e189323afe4d836f1848f82c7dded0e58vboxsync return S_OK;
648b0a0e189323afe4d836f1848f82c7dded0e58vboxsync}
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync/**
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * Resets (wipes) stored credentials.
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync *
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * @return HRESULT
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync */
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsyncHRESULT
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsyncVBoxCredProvCredential::Reset(void)
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync{
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::Reset: Wiping credentials user=%ls, pw=%ls, domain=%ls\n",
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync m_apwszCredentials[VBOXCREDPROV_FIELDID_USERNAME],
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync#ifdef DEBUG
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync m_apwszCredentials[VBOXCREDPROV_FIELDID_PASSWORD],
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync#else
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync L"XXX" /* Don't show any passwords in release mode. */,
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync#endif
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync m_apwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME]);
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync VbglR3CredentialsDestroyUtf16(m_apwszCredentials[VBOXCREDPROV_FIELDID_USERNAME],
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync m_apwszCredentials[VBOXCREDPROV_FIELDID_PASSWORD],
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync m_apwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME],
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync 3 /* Passes */);
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync HRESULT hr = S_OK;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync if (m_pEvents)
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync {
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync /* Note: On Windows 8, set "this" to "nullptr". */
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync HRESULT hr2 = m_pEvents->SetFieldString(this, VBOXCREDPROV_FIELDID_USERNAME, L"");
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync if (SUCCEEDED(hr))
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync hr = hr2;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync hr2 = m_pEvents->SetFieldString(this, VBOXCREDPROV_FIELDID_PASSWORD, L"");
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync if (SUCCEEDED(hr))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = hr2;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr2 = m_pEvents->SetFieldString(this, VBOXCREDPROV_FIELDID_DOMAINNAME, L"");
648b0a0e189323afe4d836f1848f82c7dded0e58vboxsync if (SUCCEEDED(hr))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = hr2;
afa761a969c8883e5ea370e898d40ce053fbcb22vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::Reset: Returned hr=%08x\n", hr);
afa761a969c8883e5ea370e898d40ce053fbcb22vboxsync return hr;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync
3242fe628b2306c050fb28c489d50bc63118f0c5vboxsync/**
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * Checks and retrieves credentials provided by the host + does account lookup on eventually
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync * renamed user accounts.
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync *
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * @return IPRT status code.
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync */
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsyncint
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsyncVBoxCredProvCredential::RetrieveCredentials(void)
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync{
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync int rc = VbglR3CredentialsQueryAvailability();
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync if (RT_SUCCESS(rc))
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync {
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync /*
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync * Set status to "terminating" to let the host know this module now
3242fe628b2306c050fb28c489d50bc63118f0c5vboxsync * tries to receive and use passed credentials so that credentials from
3242fe628b2306c050fb28c489d50bc63118f0c5vboxsync * the host won't be sent twice.
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync */
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync VBoxCredProvReportStatus(VBoxGuestFacilityStatus_Terminating);
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync rc = VbglR3CredentialsRetrieveUtf16(&m_apwszCredentials[VBOXCREDPROV_FIELDID_USERNAME],
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync &m_apwszCredentials[VBOXCREDPROV_FIELDID_PASSWORD],
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync &m_apwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME]);
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::RetrieveCredentials: Retrieved credentials with rc=%Rrc\n", rc);
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync }
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync if (RT_SUCCESS(rc))
648b0a0e189323afe4d836f1848f82c7dded0e58vboxsync {
648b0a0e189323afe4d836f1848f82c7dded0e58vboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::RetrieveCredentials: User=%ls, Password=%ls, Domain=%ls\n",
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync m_apwszCredentials[VBOXCREDPROV_FIELDID_USERNAME],
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync#ifdef DEBUG
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync m_apwszCredentials[VBOXCREDPROV_FIELDID_PASSWORD],
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync#else
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync L"XXX" /* Don't show any passwords in release mode. */,
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync#endif
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync m_apwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME]);
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync /*
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * In case we got a "display name" (e.g. "John Doe")
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * instead of the real user name (e.g. "jdoe") we have
683371bbf37760161d1b8454ce978acf89bbb04fvboxsync * to translate the data first ...
683371bbf37760161d1b8454ce978acf89bbb04fvboxsync */
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync PWSTR pwszAcount;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync if (TranslateAccountName(m_apwszCredentials[VBOXCREDPROV_FIELDID_USERNAME], &pwszAcount))
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync {
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::RetrieveCredentials: Translated account name %ls -> %ls\n",
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync m_apwszCredentials[VBOXCREDPROV_FIELDID_USERNAME], pwszAcount);
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync if (m_apwszCredentials[VBOXCREDPROV_FIELDID_USERNAME])
3c3fadf5aeb22d1e9869e5fd72bdd6b1ebd4d4acvboxsync {
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync RTMemWipeThoroughly(m_apwszCredentials[VBOXCREDPROV_FIELDID_USERNAME],
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync RTUtf16Len(m_apwszCredentials[VBOXCREDPROV_FIELDID_USERNAME]) + sizeof(RTUTF16),
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync 3 /* Passes */);
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync RTUtf16Free(m_apwszCredentials[VBOXCREDPROV_FIELDID_USERNAME]);
648b0a0e189323afe4d836f1848f82c7dded0e58vboxsync }
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync m_apwszCredentials[VBOXCREDPROV_FIELDID_USERNAME] = pwszAcount;
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync }
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync else
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync {
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync /*
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * Okay, no display name, but maybe it's a
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * principal name from which we have to extract the domain from?
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * (jdoe@my-domain.sub.net.com -> jdoe in domain my-domain.sub.net.com.)
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync */
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync PWSTR pwszDomain;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync if (ExtractAccoutData(m_apwszCredentials[VBOXCREDPROV_FIELDID_USERNAME],
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync &pwszAcount, &pwszDomain))
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync {
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync /* Update user name. */
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync if (m_apwszCredentials[VBOXCREDPROV_FIELDID_USERNAME])
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync {
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync RTMemWipeThoroughly(m_apwszCredentials[VBOXCREDPROV_FIELDID_USERNAME],
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync RTUtf16Len(m_apwszCredentials[VBOXCREDPROV_FIELDID_USERNAME]) + sizeof(RTUTF16),
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync 3 /* Passes */);
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync RTUtf16Free(m_apwszCredentials[VBOXCREDPROV_FIELDID_USERNAME]);
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync }
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync m_apwszCredentials[VBOXCREDPROV_FIELDID_USERNAME] = pwszAcount;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync /* Update domain. */
648b0a0e189323afe4d836f1848f82c7dded0e58vboxsync if (m_apwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME])
648b0a0e189323afe4d836f1848f82c7dded0e58vboxsync {
648b0a0e189323afe4d836f1848f82c7dded0e58vboxsync RTMemWipeThoroughly(m_apwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME],
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync RTUtf16Len(m_apwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME]) + sizeof(RTUTF16),
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync 3 /* Passes */);
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync RTUtf16Free(m_apwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME]);
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync }
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync m_apwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME] = pwszDomain;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::RetrieveCredentials: Extracted account data pwszAccount=%ls, pwszDomain=%ls\n",
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync m_apwszCredentials[VBOXCREDPROV_FIELDID_USERNAME],
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync m_apwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME]);
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync }
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync }
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync m_fHaveCreds = true;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync }
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync else
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync {
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync /* If credentials already were retrieved by a former call, don't try to retrieve new ones
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * and just report back the already retrieved ones. */
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync if (m_fHaveCreds)
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync {
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::RetrieveCredentials: Credentials already retrieved\n");
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync rc = VINF_SUCCESS;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync }
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync }
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::RetrieveCredentials: Returned rc=%Rrc\n", rc);
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync return rc;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync}
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync/**
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * Initializes this credential with the current credential provider
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * usage scenario.
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync */
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsyncHRESULT
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsyncVBoxCredProvCredential::Initialize(CREDENTIAL_PROVIDER_USAGE_SCENARIO enmUsageScenario)
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync{
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::Initialize: enmUsageScenario=%ld\n", enmUsageScenario);
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync m_enmUsageScenario = enmUsageScenario;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync return S_OK;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync}
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync/**
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * Called by LogonUI when it needs this credential's advice.
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync *
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * At the moment we only grab the credential provider events so that we can
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * trigger a re-enumeration of the credentials later.
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync */
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsyncHRESULT
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsyncVBoxCredProvCredential::Advise(ICredentialProviderCredentialEvents *pEvents)
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync{
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::Advise: pEvents=0x%p\n",
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync pEvents);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (m_pEvents)
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync {
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync m_pEvents->Release();
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync m_pEvents = NULL;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync }
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync m_pEvents = pEvents;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync if (m_pEvents)
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync m_pEvents->AddRef();
fa7ed0e340622064310fc195e6ae1ae6e6974a30vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync return S_OK;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync}
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync/**
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * Called by LogonUI when it's finished with handling this credential.
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync *
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * We only need to release the credential provider events, if any.
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync */
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsyncHRESULT
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsyncVBoxCredProvCredential::UnAdvise(void)
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync{
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::UnAdvise\n");
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync if (m_pEvents)
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync {
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync m_pEvents->Release();
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync m_pEvents = NULL;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync }
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync return S_OK;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync}
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync/**
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * Called by LogonUI when a user profile (tile) has been selected.
fa7ed0e340622064310fc195e6ae1ae6e6974a30vboxsync *
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * As we don't want Winlogon to try logging in immediately we set pfAutoLogon
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * to FALSE (if set).
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync */
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsyncHRESULT
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsyncVBoxCredProvCredential::SetSelected(PBOOL pfAutoLogon)
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync{
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::SetSelected\n");
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync /*
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * Don't do auto logon here because it would retry too often with
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * every credential field (user name, password, domain, ...) which makes
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * winlogon wait before new login attempts can be made.
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync */
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync if (pfAutoLogon)
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync *pfAutoLogon = FALSE;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync return S_OK;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync}
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Called by LogonUI when a user profile (tile) has been unselected again.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
05406988cc320ac1b0971de976b6cf0c986044a9vboxsyncHRESULT
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVBoxCredProvCredential::SetDeselected(void)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
afa761a969c8883e5ea370e898d40ce053fbcb22vboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::SetDeselected\n");
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync Reset();
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (m_pEvents)
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync m_pEvents->SetFieldString(this, VBOXCREDPROV_FIELDID_PASSWORD, L"");
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync return S_OK;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync}
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync/**
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync * Called by LogonUI to retrieve the (interactive) state of a UI field.
ad9297dbc9565afa293c95d8a3eb2cc4bbaffe27vboxsync */
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsyncHRESULT
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsyncVBoxCredProvCredential::GetFieldState(DWORD dwFieldID, CREDENTIAL_PROVIDER_FIELD_STATE *pFieldState,
1db6afc370c2fa84144478dffa9c1ed3c28c7158vboxsync CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE *pFieldstateInteractive)
1db6afc370c2fa84144478dffa9c1ed3c28c7158vboxsync{
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::GetFieldState: dwFieldID=%ld\n", dwFieldID);
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync HRESULT hr = S_OK;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync if ( (dwFieldID < VBOXCREDPROV_NUM_FIELDS)
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync && pFieldState
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && pFieldstateInteractive)
3242fe628b2306c050fb28c489d50bc63118f0c5vboxsync {
3242fe628b2306c050fb28c489d50bc63118f0c5vboxsync *pFieldState = s_VBoxCredProvFields[dwFieldID].state;
cea26cf0a0d390c2cca75cb19cb0e86c580e9d77vboxsync *pFieldstateInteractive = s_VBoxCredProvFields[dwFieldID].stateInteractive;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync hr = E_INVALIDARG;
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Searches the account name based on a display (real) name (e.g. "John Doe" -> "jdoe").
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Result "ppwszAccoutName" needs to be freed with CoTaskMemFree!
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
323b78bf4831666c95416edf3b6e54657a769e5dvboxsyncBOOL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVBoxCredProvCredential::TranslateAccountName(PWSTR pwszDisplayName, PWSTR *ppwszAccoutName)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync AssertPtrReturn(pwszDisplayName, FALSE);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::TranslateAccountName: Getting account name for \"%ls\" ...\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pwszDisplayName);
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** @todo Do we need ADS support (e.g. TranslateNameW) here? */
23de3d76e5d27015e334e6ff763ab08de5969363vboxsync BOOL fFound = FALSE; /* Did we find the desired user? */
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync NET_API_STATUS rcStatus;
23de3d76e5d27015e334e6ff763ab08de5969363vboxsync DWORD dwLevel = 2; /* Detailed information about user accounts. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync DWORD dwPrefMaxLen = MAX_PREFERRED_LENGTH;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync DWORD dwEntriesRead = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync DWORD dwTotalEntries = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync DWORD dwResumeHandle = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LPUSER_INFO_2 pBuf = NULL;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LPUSER_INFO_2 pCurBuf = NULL;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync do
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rcStatus = NetUserEnum(NULL, /* Server name, NULL for localhost. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync dwLevel,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync FILTER_NORMAL_ACCOUNT,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync (LPBYTE*)&pBuf,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync dwPrefMaxLen,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync &dwEntriesRead,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync &dwTotalEntries,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync &dwResumeHandle);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ( rcStatus == NERR_Success
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync || rcStatus == ERROR_MORE_DATA)
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ((pCurBuf = pBuf) != NULL)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (DWORD i = 0; i < dwEntriesRead; i++)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync * Search for the "display name" - that might be
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * "John Doe" or something similar the user recognizes easier
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync * and may not the same as the "account" name (e.g. "jdoe").
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ( pCurBuf
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && pCurBuf->usri2_full_name
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && StrCmpI(pwszDisplayName, pCurBuf->usri2_full_name) == 0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
2309a5a68c254f4881841fbf8118e899c32d7385vboxsync /*
61e80138f3c5ea5213990bde94a973c8e64d1dadvboxsync * Copy the real user name (e.g. "jdoe") to our
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * output buffer.
61e80138f3c5ea5213990bde94a973c8e64d1dadvboxsync */
61e80138f3c5ea5213990bde94a973c8e64d1dadvboxsync LPWSTR pwszTemp;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr = SHStrDupW(pCurBuf->usri2_name, &pwszTemp);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (hr == S_OK)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *ppwszAccoutName = pwszTemp;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync fFound = TRUE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
fe95fa9fc2a364e3d678307971cc900b89f5c94avboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::TranslateAccountName: Error copying data, hr=%08x\n", hr);
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pCurBuf++;
61e80138f3c5ea5213990bde94a973c8e64d1dadvboxsync }
61e80138f3c5ea5213990bde94a973c8e64d1dadvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pBuf != NULL)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NetApiBufferFree(pBuf);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pBuf = NULL;
61e80138f3c5ea5213990bde94a973c8e64d1dadvboxsync }
61e80138f3c5ea5213990bde94a973c8e64d1dadvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync } while (rcStatus == ERROR_MORE_DATA && !fFound);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pBuf != NULL)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NetApiBufferFree(pBuf);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pBuf = NULL;
2309a5a68c254f4881841fbf8118e899c32d7385vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::TranslateAccountName returned rcStatus=%ld, fFound=%RTbool\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rcStatus, fFound);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return fFound;
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#if 0
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync DWORD dwErr = NO_ERROR;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ULONG cbLen = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ( TranslateNameW(pwszName, NameUnknown, NameUserPrincipal, NULL, &cbLen)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && cbLen > 0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::GetAccountName: Translated ADS name has %u characters\n", cbLen));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ppwszAccoutName = (PWSTR)RTMemAlloc(cbLen * sizeof(WCHAR));
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync AssertPtrReturn(pwszName, FALSE);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (TranslateNameW(pwszName, NameUnknown, NameUserPrincipal, ppwszAccoutName, &cbLen))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::GetAccountName: Real ADS account name of '%ls' is '%ls'\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pwszName, ppwszAccoutName));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync RTMemFree(ppwszAccoutName);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync dwErr = GetLastError();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync dwErr = GetLastError();
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync /* The above method for looking up in ADS failed, try another one. */
be9bc9b4ba510c4b4159c193f783d024633ef8e9vboxsync if (dwErr != NO_ERROR)
2309a5a68c254f4881841fbf8118e899c32d7385vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync dwErr = NO_ERROR;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
be9bc9b4ba510c4b4159c193f783d024633ef8e9vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Extracts the actual account name & domain from a (raw) account data string.
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync *
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync * This might be a principal or FQDN string.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
090f6abdd6282f48527b83162b8b441425f05e36vboxsyncBOOL
090f6abdd6282f48527b83162b8b441425f05e36vboxsyncVBoxCredProvCredential::ExtractAccoutData(PWSTR pwszAccountData, PWSTR *ppwszAccoutName, PWSTR *ppwszDomain)
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync{
2afbe132eb7931e0125141eabe3a48e08f1ffab5vboxsync AssertPtrReturn(pwszAccountData, FALSE);
9371df33e2b99a59304093df9f492440fdbff171vboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::ExtractAccoutData: Getting account name for \"%ls\" ...\n",
9371df33e2b99a59304093df9f492440fdbff171vboxsync pwszAccountData);
9371df33e2b99a59304093df9f492440fdbff171vboxsync HRESULT hr = E_FAIL;
9371df33e2b99a59304093df9f492440fdbff171vboxsync
9371df33e2b99a59304093df9f492440fdbff171vboxsync /* Try to figure out whether this is a principal name (user@domain). */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LPWSTR pPos = NULL;
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync if ( (pPos = StrChrW(pwszAccountData, L'@')) != NULL
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && pPos != pwszAccountData)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync size_t cbSize = (pPos - pwszAccountData) * sizeof(WCHAR);
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync LPWSTR pwszName = (LPWSTR)CoTaskMemAlloc(cbSize + sizeof(WCHAR)); /* Space for terminating zero. */
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync LPWSTR pwszDomain = NULL;
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync AssertPtr(pwszName);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = StringCbCopyN(pwszName, cbSize + sizeof(WCHAR), pwszAccountData, cbSize);
090f6abdd6282f48527b83162b8b441425f05e36vboxsync if (SUCCEEDED(hr))
090f6abdd6282f48527b83162b8b441425f05e36vboxsync {
090f6abdd6282f48527b83162b8b441425f05e36vboxsync *ppwszAccoutName = pwszName;
090f6abdd6282f48527b83162b8b441425f05e36vboxsync *pPos++; /* Skip @, point to domain name (if any). */
118e1c3f853f78b4aec64afdcb8379981f41314fvboxsync if ( pPos != NULL
118e1c3f853f78b4aec64afdcb8379981f41314fvboxsync && *pPos != L'\0')
118e1c3f853f78b4aec64afdcb8379981f41314fvboxsync {
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync hr = SHStrDupW(pPos, &pwszDomain);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (SUCCEEDED(hr))
090f6abdd6282f48527b83162b8b441425f05e36vboxsync {
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync *ppwszDomain = pwszDomain;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::ExtractAccoutData: Error copying domain data, hr=%08x\n", hr);
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync }
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = E_FAIL;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::ExtractAccoutData: No domain name found!\n");
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::ExtractAccoutData: Error copying account data, hr=%08x\n", hr);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (hr != S_OK)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
e11fe099decbb0f65cfcc7e2939fa00bacefbb1cvboxsync CoTaskMemFree(pwszName);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pwszDomain)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CoTaskMemFree(pwszDomain);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::ExtractAccoutData: No valid principal account name found!\n");
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
afa761a969c8883e5ea370e898d40ce053fbcb22vboxsync return (hr == S_OK);
afa761a969c8883e5ea370e898d40ce053fbcb22vboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Returns the value of a specified LogonUI field.
f3701698f9d61fed78c320c3b35c64a0c63d6db1vboxsync *
648b0a0e189323afe4d836f1848f82c7dded0e58vboxsync * @return IPRT status code.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param dwFieldID Field ID to get value for.
0b65654be767b9fb7677181ddb434d8467f608e3vboxsync * @param ppwszString Pointer that receives the actual value of the specified field.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncHRESULT
323b78bf4831666c95416edf3b6e54657a769e5dvboxsyncVBoxCredProvCredential::GetStringValue(DWORD dwFieldID, PWSTR *ppwszString)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr;
f3701698f9d61fed78c320c3b35c64a0c63d6db1vboxsync if ( dwFieldID < VBOXCREDPROV_NUM_FIELDS
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && ppwszString)
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync {
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync switch (dwFieldID)
0ebb1ef53864eb9cc97580f722288c9b29bc5d03vboxsync {
0ebb1ef53864eb9cc97580f722288c9b29bc5d03vboxsync case VBOXCREDPROV_FIELDID_SUBMIT_BUTTON:
0ebb1ef53864eb9cc97580f722288c9b29bc5d03vboxsync /* Fill in standard value to make Winlogon happy. */
0ebb1ef53864eb9cc97580f722288c9b29bc5d03vboxsync hr = SHStrDupW(L"Submit", ppwszString);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
98502a585f6eda30527b54f7df18dd3de3d3d7c6vboxsync
a44cdd0b29504e3de7b8aa87f839ad62b6e66f51vboxsync default:
a44cdd0b29504e3de7b8aa87f839ad62b6e66f51vboxsync if ( m_apwszCredentials[dwFieldID]
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && RTUtf16Len(m_apwszCredentials[dwFieldID]))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = SHStrDupW(m_apwszCredentials[dwFieldID], ppwszString);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else /* Fill in an empty value. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = SHStrDupW(L"", ppwszString);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifdef DEBUG
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (SUCCEEDED(hr))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::GetStringValue: dwFieldID=%ld, ppwszString=%ls\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync dwFieldID, *ppwszString);
2309a5a68c254f4881841fbf8118e899c32d7385vboxsync#endif
332ccb6ac6feb4b50ec24d63ff029119164182ffvboxsync }
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = E_INVALIDARG;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return hr;
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync}
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync * Returns back the field ID of which the submit button should be put next to.
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * We always want to be the password field put next to the submit button
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * currently.
3f1e0eea71cabeb90529e546f16eb7aee513fde9vboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @return HRESULT
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param dwFieldID Field ID of the submit button.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pdwAdjacentTo Field ID where to put the submit button next to.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncHRESULT
323b78bf4831666c95416edf3b6e54657a769e5dvboxsyncVBoxCredProvCredential::GetSubmitButtonValue(DWORD dwFieldID, DWORD *pdwAdjacentTo)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::GetSubmitButtonValue: dwFieldID=%ld\n",
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync dwFieldID);
648b0a0e189323afe4d836f1848f82c7dded0e58vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr = S_OK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Validate parameters. */
dcc035155cdf232a3d79024f475c2d4448981e85vboxsync if ( dwFieldID == VBOXCREDPROV_FIELDID_SUBMIT_BUTTON
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync && pdwAdjacentTo)
a64bf60e92e5cb8a76aa6c8e92193932d88a906fvboxsync {
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync /* pdwAdjacentTo is a pointer to the fieldID you want the submit button to appear next to. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *pdwAdjacentTo = VBOXCREDPROV_FIELDID_PASSWORD;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::GetSubmitButtonValue: dwFieldID=%ld, *pdwAdjacentTo=%ld\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync dwFieldID, *pdwAdjacentTo);
d45f7f7fe0c28b500b45b2dc88d7a04f4c0be6b8vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = E_INVALIDARG;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Sets the value of a specified field. Currently not used.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @return HRESULT
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param dwFieldID Field to set value for.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pcwzString Actual value to set.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsyncHRESULT
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVBoxCredProvCredential::SetStringValue(DWORD dwFieldID, PCWSTR pcwzString)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync#ifdef DEBUG
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::SetStringValue: dwFieldID=%ld, pcwzString=%ls\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync dwFieldID, pcwzString);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Do more things here later. */
13d75a5db336ccb682d7ab28b397a4f0b8982ea3vboxsync HRESULT hr = S_OK;
13d75a5db336ccb682d7ab28b397a4f0b8982ea3vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::SetStringValue returned with hr=%08x\n", hr);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return hr;
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncHRESULT
f3701698f9d61fed78c320c3b35c64a0c63d6db1vboxsyncVBoxCredProvCredential::GetBitmapValue(DWORD dwFieldID, HBITMAP *phBitmap)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NOREF(dwFieldID);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NOREF(phBitmap);
648b0a0e189323afe4d836f1848f82c7dded0e58vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* We don't do own bitmaps. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return E_NOTIMPL;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncHRESULT
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVBoxCredProvCredential::GetCheckboxValue(DWORD dwFieldID, BOOL *pfChecked, PWSTR *ppwszLabel)
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync{
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync NOREF(dwFieldID);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NOREF(pfChecked);
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync NOREF(ppwszLabel);
648b0a0e189323afe4d836f1848f82c7dded0e58vboxsync return E_NOTIMPL;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
dcc035155cdf232a3d79024f475c2d4448981e85vboxsyncHRESULT
a64bf60e92e5cb8a76aa6c8e92193932d88a906fvboxsyncVBoxCredProvCredential::GetComboBoxValueCount(DWORD dwFieldID, DWORD *pcItems, DWORD *pdwSelectedItem)
a64bf60e92e5cb8a76aa6c8e92193932d88a906fvboxsync{
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync NOREF(dwFieldID);
648b0a0e189323afe4d836f1848f82c7dded0e58vboxsync NOREF(pcItems);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NOREF(pdwSelectedItem);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return E_NOTIMPL;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
bee1a7d4b183cab9654f247b3ea8cf680842bed5vboxsync
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsyncHRESULT
323b78bf4831666c95416edf3b6e54657a769e5dvboxsyncVBoxCredProvCredential::GetComboBoxValueAt(DWORD dwFieldID, DWORD dwItem, PWSTR *ppwszItem)
afa761a969c8883e5ea370e898d40ce053fbcb22vboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NOREF(dwFieldID);
96dce0123cc032388e78766d08f9ee5a66b80facvboxsync NOREF(dwItem);
96dce0123cc032388e78766d08f9ee5a66b80facvboxsync NOREF(ppwszItem);
96dce0123cc032388e78766d08f9ee5a66b80facvboxsync return E_NOTIMPL;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
323b78bf4831666c95416edf3b6e54657a769e5dvboxsyncHRESULT
323b78bf4831666c95416edf3b6e54657a769e5dvboxsyncVBoxCredProvCredential::SetCheckboxValue(DWORD dwFieldID, BOOL fChecked)
afa761a969c8883e5ea370e898d40ce053fbcb22vboxsync{
afa761a969c8883e5ea370e898d40ce053fbcb22vboxsync NOREF(dwFieldID);
648b0a0e189323afe4d836f1848f82c7dded0e58vboxsync NOREF(fChecked);
afa761a969c8883e5ea370e898d40ce053fbcb22vboxsync return E_NOTIMPL;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncHRESULT
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVBoxCredProvCredential::SetComboBoxSelectedValue(DWORD dwFieldId, DWORD dwSelectedItem)
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NOREF(dwFieldId);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NOREF(dwSelectedItem);
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync return E_NOTIMPL;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncHRESULT
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVBoxCredProvCredential::CommandLinkClicked(DWORD dwFieldID)
13d75a5db336ccb682d7ab28b397a4f0b8982ea3vboxsync{
13d75a5db336ccb682d7ab28b397a4f0b8982ea3vboxsync NOREF(dwFieldID);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return E_NOTIMPL;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
afa761a969c8883e5ea370e898d40ce053fbcb22vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Does the actual authentication stuff to attempt a login.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @return HRESULT
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pcpGetSerializationResponse Credential serialization response.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pcpCredentialSerialization Details about the current credential.
d45f7f7fe0c28b500b45b2dc88d7a04f4c0be6b8vboxsync * @param ppwszOptionalStatusText Text to set. Optional.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pcpsiOptionalStatusIcon Status icon to set. Optional.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncHRESULT
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVBoxCredProvCredential::GetSerialization(CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE *pcpGetSerializationResponse,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION *pcpCredentialSerialization,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PWSTR *ppwszOptionalStatusText,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CREDENTIAL_PROVIDER_STATUS_ICON *pcpsiOptionalStatusIcon)
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NOREF(ppwszOptionalStatusText);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NOREF(pcpsiOptionalStatusIcon);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync KERB_INTERACTIVE_UNLOCK_LOGON KerberosUnlockLogon;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RT_BZERO(&KerberosUnlockLogon, sizeof(KerberosUnlockLogon));
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Save a pointer to the interactive logon struct. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync KERB_INTERACTIVE_LOGON *pKerberosLogon = &KerberosUnlockLogon.Logon;
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync AssertPtr(pKerberosLogon);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync HRESULT hr;
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifdef DEBUG
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::GetSerialization: Username=%ls, Password=%ls, Domain=%ls\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync m_apwszCredentials[VBOXCREDPROV_FIELDID_USERNAME],
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync m_apwszCredentials[VBOXCREDPROV_FIELDID_PASSWORD],
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync m_apwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME]);
13d75a5db336ccb682d7ab28b397a4f0b8982ea3vboxsync#endif
13d75a5db336ccb682d7ab28b397a4f0b8982ea3vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Do we have a domain name set? */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ( m_apwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME]
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync && RTUtf16Len(m_apwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME]))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = RTUTF16ToUnicode(&pKerberosLogon->LogonDomainName,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync m_apwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME],
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync false /* Just assign, no copy */);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
f3701698f9d61fed78c320c3b35c64a0c63d6db1vboxsync else /* No domain (FQDN) given, try local computer name. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync WCHAR wszComputerName[MAX_COMPUTERNAME_LENGTH + 1];
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync DWORD cch = ARRAYSIZE(wszComputerName);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (GetComputerNameW(wszComputerName, &cch))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync /* Is a domain name missing? Then use the name of the local computer. */
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync hr = RTUTF16ToUnicode(&pKerberosLogon->LogonDomainName,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync wszComputerName,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync false /* Just assign, no copy */);
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::GetSerialization: Local computer name=%ls\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync wszComputerName);
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync }
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync else
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync hr = HRESULT_FROM_WIN32(GetLastError());
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync }
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync if (SUCCEEDED(hr))
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync {
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync /* Fill in the username and password. */
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync if (SUCCEEDED(hr))
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync {
98502a585f6eda30527b54f7df18dd3de3d3d7c6vboxsync hr = RTUTF16ToUnicode(&pKerberosLogon->UserName,
98502a585f6eda30527b54f7df18dd3de3d3d7c6vboxsync m_apwszCredentials[VBOXCREDPROV_FIELDID_USERNAME],
98502a585f6eda30527b54f7df18dd3de3d3d7c6vboxsync false /* Just assign, no copy */);
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync if (SUCCEEDED(hr))
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync {
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync hr = RTUTF16ToUnicode(&pKerberosLogon->Password,
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync m_apwszCredentials[VBOXCREDPROV_FIELDID_PASSWORD],
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync false /* Just assign, no copy */);
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync if (SUCCEEDED(hr))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* Set credential type according to current usage scenario. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertPtr(pKerberosLogon);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync switch (m_enmUsageScenario)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case CPUS_UNLOCK_WORKSTATION:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pKerberosLogon->MessageType = KerbWorkstationUnlockLogon;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case CPUS_LOGON:
ebe05ec36d1fcd24d62e7066dedcb4eb2e691358vboxsync pKerberosLogon->MessageType = KerbInteractiveLogon;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case CPUS_CREDUI:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pKerberosLogon->MessageType = (KERB_LOGON_SUBMIT_TYPE)0; /* No message type required here. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
dd8efff5286a99cf8d9b3a5e8dd62340973f3cc1vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync default:
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = E_FAIL;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
f3701698f9d61fed78c320c3b35c64a0c63d6db1vboxsync
648b0a0e189323afe4d836f1848f82c7dded0e58vboxsync if (SUCCEEDED(hr)) /* Build the logon package. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = AllocateLogonPackage(KerberosUnlockLogon,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync &pcpCredentialSerialization->rgbSerialization,
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync &pcpCredentialSerialization->cbSerialization);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
9d4c9e0a3e2dcc3bd19303d7b4e2d96d12c11814vboxsync if (SUCCEEDED(hr))
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync {
f3701698f9d61fed78c320c3b35c64a0c63d6db1vboxsync ULONG ulAuthPackage;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync HANDLE hLsa;
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync NTSTATUS s = LsaConnectUntrusted(&hLsa);
0ebb1ef53864eb9cc97580f722288c9b29bc5d03vboxsync if (SUCCEEDED(HRESULT_FROM_NT(s)))
0ebb1ef53864eb9cc97580f722288c9b29bc5d03vboxsync {
0ebb1ef53864eb9cc97580f722288c9b29bc5d03vboxsync LSA_STRING lsaszKerberosName;
0ebb1ef53864eb9cc97580f722288c9b29bc5d03vboxsync size_t cchKerberosName;
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync hr = StringCchLengthA(NEGOSSP_NAME_A, USHORT_MAX, &cchKerberosName);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (SUCCEEDED(hr))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync USHORT usLength;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = SizeTToUShort(cchKerberosName, &usLength);
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync if (SUCCEEDED(hr))
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync lsaszKerberosName.Buffer = (PCHAR)NEGOSSP_NAME_A;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync lsaszKerberosName.Length = usLength;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync lsaszKerberosName.MaximumLength = lsaszKerberosName.Length + 1;
2309a5a68c254f4881841fbf8118e899c32d7385vboxsync
332ccb6ac6feb4b50ec24d63ff029119164182ffvboxsync }
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (SUCCEEDED(hr))
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync {
8dee1778d3770cdc584752c84acf4899d8bfc9f9vboxsync s = LsaLookupAuthenticationPackage(hLsa, &lsaszKerberosName,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync &ulAuthPackage);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (FAILED(HRESULT_FROM_NT(s)))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hr = HRESULT_FROM_NT(s);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync LsaDeregisterLogonProcess(hLsa);
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (SUCCEEDED(hr))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pcpCredentialSerialization->ulAuthenticationPackage = ulAuthPackage;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pcpCredentialSerialization->clsidCredentialProvider = CLSID_VBoxCredProvider;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* We're done -- let the logon UI know. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *pcpGetSerializationResponse = CPGSR_RETURN_CREDENTIAL_FINISHED;
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync }
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync }
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync
f3701698f9d61fed78c320c3b35c64a0c63d6db1vboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::GetSerialization returned hr=0x%08x\n", hr);
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync return hr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Called by LogonUI after a logon attempt was made -- here we could set an additional status
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync * text and/or icon.
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync *
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync * Currently not used.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @return HRESULT
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param ntStatus NT status of logon attempt reported by Winlogon.
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync * @param ntSubStatus NT substatus of logon attempt reported by Winlogon.
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync * @param ppwszOptionalStatusText Pointer that receives the optional status text.
f3701698f9d61fed78c320c3b35c64a0c63d6db1vboxsync * @param pcpsiOptionalStatusIcon Pointer that receives the optional status icon.
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncHRESULT
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVBoxCredProvCredential::ReportResult(NTSTATUS ntStatus,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync NTSTATUS ntSubStatus,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PWSTR *ppwszOptionalStatusText,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CREDENTIAL_PROVIDER_STATUS_ICON *pcpsiOptionalStatusIcon)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VBoxCredProvVerbose(0, "VBoxCredProvCredential::ReportResult: ntStatus=%ld, ntSubStatus=%ld\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ntStatus, ntSubStatus);
323b78bf4831666c95416edf3b6e54657a769e5dvboxsync return S_OK;
9a0f1c40d078ffc54c3209648d12c70f36480067vboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync