mirror of
https://github.com/tenrok/Rfid-Credential-Provider.git
synced 2026-06-17 19:30:32 +03:00
Z-2 USB Reader
This commit is contained in:
@@ -12,15 +12,13 @@
|
||||
#include "Logger.h"
|
||||
|
||||
extern HINSTANCE hInstance;
|
||||
typedef int (WINAPI * PFRUNGATEFRAMEWORKPWDRESET) (HWND, PWSTR, PWSTR, PWSTR);
|
||||
typedef int (WINAPI* PFRUNGATEFRAMEWORKPWDRESET) (HWND, PWSTR, PWSTR, PWSTR);
|
||||
|
||||
|
||||
RfidCredential::RfidCredential():
|
||||
RfidCredential::RfidCredential() :
|
||||
_cRef(1),
|
||||
_pCredProvCredentialEvents(NULL)
|
||||
{
|
||||
DllAddRef();
|
||||
|
||||
ZeroMemory(_rgCredProvFieldDescriptors, sizeof(_rgCredProvFieldDescriptors));
|
||||
ZeroMemory(_rgFieldStatePairs, sizeof(_rgFieldStatePairs));
|
||||
ZeroMemory(_rgFieldStrings, sizeof(_rgFieldStrings));
|
||||
@@ -33,7 +31,6 @@ RfidCredential::~RfidCredential()
|
||||
CoTaskMemFree(_rgFieldStrings[i]);
|
||||
CoTaskMemFree(_rgCredProvFieldDescriptors[i].pszLabel);
|
||||
}
|
||||
|
||||
DllRelease();
|
||||
}
|
||||
|
||||
@@ -46,24 +43,20 @@ HRESULT RfidCredential::Initialize(
|
||||
PWSTR pwzUsername,
|
||||
PWSTR pwzPassword,
|
||||
PWSTR pwzDomain
|
||||
)
|
||||
)
|
||||
{
|
||||
|
||||
UNREFERENCED_PARAMETER(pwzPassword);
|
||||
|
||||
HRESULT hr = S_OK;
|
||||
|
||||
for (DWORD i = 0; SUCCEEDED(hr) && i < ARRAYSIZE(_rgCredProvFieldDescriptors); i++)
|
||||
{
|
||||
_rgFieldStatePairs[i] = rgfsp[i];
|
||||
hr = FieldDescriptorCopy(rgcpfd[i], &_rgCredProvFieldDescriptors[i]);
|
||||
}
|
||||
|
||||
username = pwzUsername;
|
||||
password = pwzPassword;
|
||||
domain = pwzDomain;
|
||||
LPWSTR loginString;
|
||||
if(username && domain){
|
||||
if (username && domain) {
|
||||
loginString = new wchar_t[10 + wcslen(username) + wcslen(password)];
|
||||
wsprintf(loginString, L"Login as %s\\%s", domain, username);
|
||||
}
|
||||
@@ -73,35 +66,37 @@ HRESULT RfidCredential::Initialize(
|
||||
}
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
if(!username){
|
||||
if (!username)
|
||||
{
|
||||
hr = SHStrDupW(L"Swipe your registered RFID credential now.", &_rgFieldStrings[SFI_DETAILS]);
|
||||
}else{
|
||||
}
|
||||
else
|
||||
{
|
||||
hr = SHStrDupW(loginString, &_rgFieldStrings[SFI_DETAILS]);
|
||||
}
|
||||
}
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
if(!username){
|
||||
if (!username)
|
||||
{
|
||||
hr = SHStrDupW(L"Swipe your token", &_rgFieldStrings[SFI_MINIDETAILS]);
|
||||
}else{
|
||||
}
|
||||
else
|
||||
{
|
||||
hr = SHStrDupW(loginString, &_rgFieldStrings[SFI_MINIDETAILS]);
|
||||
}
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT RfidCredential::Advise(
|
||||
ICredentialProviderCredentialEvents* pcpce
|
||||
)
|
||||
HRESULT RfidCredential::Advise(ICredentialProviderCredentialEvents* pcpce)
|
||||
{
|
||||
if (_pCredProvCredentialEvents != NULL)
|
||||
if (_pCredProvCredentialEvents != nullptr)
|
||||
{
|
||||
_pCredProvCredentialEvents->Release();
|
||||
}
|
||||
_pCredProvCredentialEvents = pcpce;
|
||||
_pCredProvCredentialEvents->AddRef();
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
@@ -111,28 +106,29 @@ HRESULT RfidCredential::UnAdvise()
|
||||
{
|
||||
_pCredProvCredentialEvents->Release();
|
||||
}
|
||||
_pCredProvCredentialEvents = NULL;
|
||||
|
||||
_pCredProvCredentialEvents = nullptr;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT RfidCredential::SetSelected(BOOL* pbAutoLogon)
|
||||
HRESULT RfidCredential::SetSelected(BOOL* pbAutoLogon)
|
||||
{
|
||||
if(username && password && domain && !this->lastLoginFailed){
|
||||
if (username && password && domain && !this->lastLoginFailed)
|
||||
{
|
||||
*pbAutoLogon = TRUE;
|
||||
}else{
|
||||
}
|
||||
else
|
||||
{
|
||||
*pbAutoLogon = FALSE;
|
||||
|
||||
if(this->lastLoginFailed){
|
||||
if(_pCredProvCredentialEvents != NULL){
|
||||
if (this->lastLoginFailed)
|
||||
{
|
||||
if (_pCredProvCredentialEvents != nullptr)
|
||||
{
|
||||
_pCredProvCredentialEvents->SetFieldString(this, SFI_MINIDETAILS, L"Login credentials were invalid.");
|
||||
_pCredProvCredentialEvents->SetFieldString(this, SFI_DETAILS, L"Login details were invalid. You will need to login with a different credential to update them.");
|
||||
_pCredProvCredentialEvents->SetFieldBitmap(this, SFI_TILEIMAGE, LoadBitmap(HINST_THISDLL, MAKEINTRESOURCE(104)));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
@@ -142,37 +138,26 @@ HRESULT RfidCredential::SetDeselected()
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT RfidCredential::GetFieldState(
|
||||
DWORD dwFieldID,
|
||||
CREDENTIAL_PROVIDER_FIELD_STATE* pcpfs,
|
||||
CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE* pcpfis
|
||||
)
|
||||
HRESULT RfidCredential::GetFieldState(DWORD dwFieldID, CREDENTIAL_PROVIDER_FIELD_STATE* pcpfs, CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE* pcpfis)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
if ((dwFieldID < ARRAYSIZE(_rgFieldStatePairs)) && pcpfs && pcpfis)
|
||||
{
|
||||
*pcpfs = _rgFieldStatePairs[dwFieldID].cpfs;
|
||||
*pcpfis = _rgFieldStatePairs[dwFieldID].cpfis;
|
||||
|
||||
hr = S_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
hr = E_INVALIDARG;
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT RfidCredential::GetStringValue(
|
||||
DWORD dwFieldID,
|
||||
PWSTR* ppwsz
|
||||
)
|
||||
HRESULT RfidCredential::GetStringValue(DWORD dwFieldID, PWSTR* ppwsz)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
if (dwFieldID < ARRAYSIZE(_rgCredProvFieldDescriptors) && ppwsz)
|
||||
if (dwFieldID < ARRAYSIZE(_rgCredProvFieldDescriptors) && ppwsz)
|
||||
{
|
||||
hr = SHStrDupW(_rgFieldStrings[dwFieldID], ppwsz);
|
||||
}
|
||||
@@ -180,27 +165,23 @@ HRESULT RfidCredential::GetStringValue(
|
||||
{
|
||||
hr = E_INVALIDARG;
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT RfidCredential::GetBitmapValue(
|
||||
DWORD dwFieldID,
|
||||
HBITMAP* phbmp
|
||||
)
|
||||
HRESULT RfidCredential::GetBitmapValue(DWORD dwFieldID, HBITMAP* phbmp)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
if ((SFI_TILEIMAGE == dwFieldID) && phbmp)
|
||||
{
|
||||
HBITMAP hbmp;
|
||||
|
||||
if(username && password && domain && !this->lastLoginFailed){
|
||||
if (username && password && domain && !this->lastLoginFailed)
|
||||
{
|
||||
hbmp = LoadBitmap(HINST_THISDLL, MAKEINTRESOURCE(102));
|
||||
}else{
|
||||
}
|
||||
else
|
||||
{
|
||||
hbmp = LoadBitmap(HINST_THISDLL, MAKEINTRESOURCE(101));
|
||||
}
|
||||
|
||||
if (hbmp != NULL)
|
||||
{
|
||||
hr = S_OK;
|
||||
@@ -215,106 +196,73 @@ HRESULT RfidCredential::GetBitmapValue(
|
||||
{
|
||||
hr = E_INVALIDARG;
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT RfidCredential::GetSubmitButtonValue(
|
||||
DWORD dwFieldID,
|
||||
DWORD* pdwAdjacentTo
|
||||
)
|
||||
HRESULT RfidCredential::GetSubmitButtonValue(DWORD dwFieldID, DWORD* pdwAdjacentTo)
|
||||
{
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
HRESULT RfidCredential::SetStringValue(
|
||||
DWORD dwFieldID,
|
||||
PCWSTR pwz
|
||||
)
|
||||
HRESULT RfidCredential::SetStringValue(DWORD dwFieldID, PCWSTR pwz)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(dwFieldID);
|
||||
UNREFERENCED_PARAMETER(dwFieldID);
|
||||
UNREFERENCED_PARAMETER(dwFieldID);
|
||||
UNREFERENCED_PARAMETER(pwz);
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
HRESULT RfidCredential::GetCheckboxValue(
|
||||
DWORD dwFieldID,
|
||||
BOOL* pbChecked,
|
||||
PWSTR* ppwszLabel
|
||||
)
|
||||
HRESULT RfidCredential::GetCheckboxValue(DWORD dwFieldID, BOOL* pbChecked, PWSTR* ppwszLabel)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(dwFieldID);
|
||||
UNREFERENCED_PARAMETER(pbChecked);
|
||||
UNREFERENCED_PARAMETER(ppwszLabel);
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
HRESULT RfidCredential::GetComboBoxValueCount(
|
||||
DWORD dwFieldID,
|
||||
DWORD* pcItems,
|
||||
DWORD* pdwSelectedItem
|
||||
)
|
||||
HRESULT RfidCredential::GetComboBoxValueCount(DWORD dwFieldID, DWORD* pcItems, DWORD* pdwSelectedItem)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(dwFieldID);
|
||||
UNREFERENCED_PARAMETER(pcItems);
|
||||
UNREFERENCED_PARAMETER(pdwSelectedItem);
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
HRESULT RfidCredential::GetComboBoxValueAt(
|
||||
DWORD dwFieldID,
|
||||
DWORD dwItem,
|
||||
PWSTR* ppwszItem
|
||||
)
|
||||
HRESULT RfidCredential::GetComboBoxValueAt(DWORD dwFieldID, DWORD dwItem, PWSTR* ppwszItem)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(dwFieldID);
|
||||
UNREFERENCED_PARAMETER(dwItem);
|
||||
UNREFERENCED_PARAMETER(ppwszItem);
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
HRESULT RfidCredential::SetCheckboxValue(
|
||||
DWORD dwFieldID,
|
||||
BOOL bChecked
|
||||
)
|
||||
HRESULT RfidCredential::SetCheckboxValue(DWORD dwFieldID, BOOL bChecked)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(dwFieldID);
|
||||
UNREFERENCED_PARAMETER(bChecked);
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
HRESULT RfidCredential::SetComboBoxSelectedValue(
|
||||
DWORD dwFieldId,
|
||||
DWORD dwSelectedItem
|
||||
)
|
||||
HRESULT RfidCredential::SetComboBoxSelectedValue(DWORD dwFieldId, DWORD dwSelectedItem)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(dwFieldId);
|
||||
UNREFERENCED_PARAMETER(dwSelectedItem);
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
HRESULT RfidCredential::CommandLinkClicked(DWORD dwFieldID)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(dwFieldID);
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
HRESULT RfidCredential::GetSerialization(
|
||||
CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE* pcpgsr,
|
||||
CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION* pcpcs,
|
||||
PWSTR* ppwzOptionalStatusText,
|
||||
CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION* pcpcs,
|
||||
PWSTR* ppwzOptionalStatusText,
|
||||
CREDENTIAL_PROVIDER_STATUS_ICON* pcpsiOptionalStatusIcon
|
||||
)
|
||||
)
|
||||
{
|
||||
|
||||
UNREFERENCED_PARAMETER(ppwzOptionalStatusText);
|
||||
UNREFERENCED_PARAMETER(pcpsiOptionalStatusIcon);
|
||||
|
||||
@@ -322,53 +270,47 @@ HRESULT RfidCredential::GetSerialization(
|
||||
ZeroMemory(&kil, sizeof(kil));
|
||||
|
||||
HRESULT hr;
|
||||
|
||||
this->lastLoginFailed = true;
|
||||
|
||||
WCHAR wsz[MAX_COMPUTERNAME_LENGTH+1];
|
||||
DWORD cch = ARRAYSIZE(wsz);
|
||||
GetComputerNameW(wsz, &cch);
|
||||
//WCHAR wsz[MAX_COMPUTERNAME_LENGTH+1];
|
||||
//DWORD cch = ARRAYSIZE(wsz);
|
||||
//GetComputerNameW(wsz, &cch);
|
||||
hr = UnicodeStringInitWithString(domain, &kil.LogonDomainName);
|
||||
hr = UnicodeStringInitWithString(username, &kil.UserName);
|
||||
hr = UnicodeStringInitWithString(password, &kil.Password);
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
kil.MessageType = lockType;
|
||||
hr = KerbInteractiveLogonPack(kil, &pcpcs->rgbSerialization, &pcpcs->cbSerialization);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
ULONG ulAuthPackage;
|
||||
hr = RetrieveNegotiateAuthPackage(&ulAuthPackage);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
kil.MessageType = lockType;
|
||||
hr = KerbInteractiveLogonPack(kil, &pcpcs->rgbSerialization, &pcpcs->cbSerialization);
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
ULONG ulAuthPackage;
|
||||
hr = RetrieveNegotiateAuthPackage(&ulAuthPackage);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
pcpcs->ulAuthenticationPackage = ulAuthPackage;
|
||||
pcpcs->clsidCredentialProvider = CLSID_RfidProvider;
|
||||
|
||||
*pcpgsr = CPGSR_RETURN_CREDENTIAL_FINISHED;
|
||||
}
|
||||
}
|
||||
pcpcs->ulAuthenticationPackage = ulAuthPackage;
|
||||
pcpcs->clsidCredentialProvider = CLSID_RfidProvider;
|
||||
*pcpgsr = CPGSR_RETURN_CREDENTIAL_FINISHED;
|
||||
}
|
||||
else
|
||||
{
|
||||
DWORD dwErr = GetLastError();
|
||||
hr = HRESULT_FROM_WIN32(dwErr);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DWORD dwErr = GetLastError();
|
||||
hr = HRESULT_FROM_WIN32(dwErr);
|
||||
}
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT RfidCredential::ReportResult(
|
||||
NTSTATUS ntsStatus,
|
||||
NTSTATUS ntsStatus,
|
||||
NTSTATUS ntsSubstatus,
|
||||
PWSTR* ppwszOptionalStatusText,
|
||||
PWSTR* ppwszOptionalStatusText,
|
||||
CREDENTIAL_PROVIDER_STATUS_ICON* pcpsiOptionalStatusIcon
|
||||
)
|
||||
)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(ntsSubstatus);
|
||||
UNREFERENCED_PARAMETER(ppwszOptionalStatusText);
|
||||
UNREFERENCED_PARAMETER(pcpsiOptionalStatusIcon);
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user