445 lines
10 KiB
C++
445 lines
10 KiB
C++
//=============================================================================
|
||
// Copyright (c) 2000 Microsoft Corporation
|
||
//
|
||
// controls.hpp
|
||
//
|
||
// User interface control classes.
|
||
//
|
||
// Created 02/29/2000 johnstep (John Stephens)
|
||
//=============================================================================
|
||
|
||
#ifndef __CONTROLS_HPP__
|
||
#define __CONTROLS_HPP__
|
||
|
||
//-----------------------------------------------------------------------------
|
||
|
||
#include <objidl.h>
|
||
#include <scuisupp.h>
|
||
|
||
//-----------------------------------------------------------------------------
|
||
// Global Variables
|
||
//-----------------------------------------------------------------------------
|
||
|
||
extern CLSID CreduiStringArrayClassId;
|
||
|
||
#define CREDUI_STRING_ARRAY_CLASS_STRING\
|
||
L"{82BD0E67-9FEA-4748-8672-D5EFE5B779B0}"
|
||
|
||
//-----------------------------------------------------------------------------
|
||
// Types
|
||
//-----------------------------------------------------------------------------
|
||
|
||
struct CREDUI_BALLOON_TIP_INFO
|
||
{
|
||
WCHAR *Title;
|
||
WCHAR *Text;
|
||
INT Icon;
|
||
INT XPercent;
|
||
INT YPercent;
|
||
};
|
||
|
||
//-----------------------------------------------------------------------------
|
||
// CreduiBalloonTip Class
|
||
//-----------------------------------------------------------------------------
|
||
|
||
class CreduiBalloonTip
|
||
{
|
||
public:
|
||
|
||
CreduiBalloonTip();
|
||
~CreduiBalloonTip();
|
||
|
||
BOOL Init(HINSTANCE instance, HWND parentWindow);
|
||
|
||
BOOL SetInfo(HWND controlWindow, CONST CREDUI_BALLOON_TIP_INFO *tipInfo);
|
||
CREDUI_BALLOON_TIP_INFO *GetInfo() { return TipInfo; }
|
||
|
||
BOOL Show();
|
||
BOOL Hide();
|
||
BOOL IsVisible() { return Visible; }
|
||
|
||
private:
|
||
|
||
HWND Window;
|
||
HWND ParentWindow;
|
||
HWND ControlWindow;
|
||
|
||
CREDUI_BALLOON_TIP_INFO *TipInfo;
|
||
|
||
BOOL Visible;
|
||
};
|
||
|
||
//-----------------------------------------------------------------------------
|
||
// CreduiPasswordBox Class
|
||
//-----------------------------------------------------------------------------
|
||
|
||
class CreduiPasswordBox
|
||
{
|
||
public:
|
||
|
||
CreduiPasswordBox();
|
||
~CreduiPasswordBox();
|
||
|
||
BOOL Init(
|
||
HWND window,
|
||
CreduiBalloonTip *ballonTip,
|
||
CONST CREDUI_BALLOON_TIP_INFO *capsLockTipInfo,
|
||
HFONT passwordFont = NULL,
|
||
WCHAR passwordChar = L'<EFBFBD>');
|
||
|
||
private:
|
||
|
||
WNDPROC OriginalMessageHandler;
|
||
|
||
LRESULT
|
||
MessageHandler(
|
||
UINT message,
|
||
WPARAM wParam,
|
||
LPARAM lParam
|
||
);
|
||
|
||
static LRESULT CALLBACK MessageHandlerCallback(
|
||
HWND passwordWindow,
|
||
UINT message,
|
||
WPARAM wParam,
|
||
LPARAM lParam
|
||
);
|
||
|
||
HWND Window;
|
||
HFONT PasswordFont;
|
||
CreduiBalloonTip *BalloonTip;
|
||
CONST CREDUI_BALLOON_TIP_INFO *CapsLockTipInfo;
|
||
};
|
||
|
||
//-----------------------------------------------------------------------------
|
||
// CreduiStringArrayFactory Class
|
||
//-----------------------------------------------------------------------------
|
||
|
||
class CreduiStringArrayFactory : public IClassFactory
|
||
{
|
||
public:
|
||
|
||
CreduiStringArrayFactory();
|
||
|
||
// IUnknown
|
||
|
||
HRESULT STDMETHODCALLTYPE QueryInterface(
|
||
CONST IID &interfaceId,
|
||
VOID **outInterface
|
||
);
|
||
ULONG STDMETHODCALLTYPE AddRef();
|
||
ULONG STDMETHODCALLTYPE Release();
|
||
|
||
// IClassFactory
|
||
|
||
HRESULT STDMETHODCALLTYPE CreateInstance(
|
||
IUnknown *unknownOuter,
|
||
CONST IID &interfaceId,
|
||
VOID **outInterface
|
||
);
|
||
HRESULT STDMETHODCALLTYPE LockServer(BOOL lock);
|
||
|
||
private:
|
||
|
||
~CreduiStringArrayFactory(); // must use IUnknown::Release()
|
||
|
||
ULONG ReferenceCount;
|
||
};
|
||
|
||
//-----------------------------------------------------------------------------
|
||
// CreduiStringArray Class
|
||
//-----------------------------------------------------------------------------
|
||
|
||
class CreduiStringArray : public IEnumString
|
||
{
|
||
public:
|
||
|
||
CreduiStringArray();
|
||
|
||
BOOL Init(UINT count);
|
||
BOOL Find(CONST WCHAR *string);
|
||
INT Add(CONST WCHAR *string);
|
||
|
||
UINT GetCount() CONST { return Count; }
|
||
|
||
// IUnknown
|
||
|
||
HRESULT STDMETHODCALLTYPE QueryInterface(
|
||
CONST IID &interfaceId,
|
||
VOID **outInterface
|
||
);
|
||
ULONG STDMETHODCALLTYPE AddRef();
|
||
ULONG STDMETHODCALLTYPE Release();
|
||
|
||
// IEnumString
|
||
|
||
HRESULT STDMETHODCALLTYPE Next(
|
||
ULONG count,
|
||
WCHAR **array,
|
||
ULONG *countFetched
|
||
);
|
||
HRESULT STDMETHODCALLTYPE Skip(ULONG count);
|
||
HRESULT STDMETHODCALLTYPE Reset();
|
||
HRESULT STDMETHODCALLTYPE Clone(IEnumString **enumInterface);
|
||
|
||
private:
|
||
|
||
~CreduiStringArray(); // must use IUnknown::Release()
|
||
|
||
ULONG ReferenceCount;
|
||
UINT Index;
|
||
UINT Count;
|
||
UINT MaxCount;
|
||
WCHAR **Array;
|
||
};
|
||
|
||
//-----------------------------------------------------------------------------
|
||
// CreduiAutoCompleteComboBox Class
|
||
//-----------------------------------------------------------------------------
|
||
|
||
class CreduiAutoCompleteComboBox
|
||
{
|
||
public:
|
||
|
||
CreduiAutoCompleteComboBox();
|
||
~CreduiAutoCompleteComboBox();
|
||
|
||
BOOL Init(
|
||
HMODULE instance,
|
||
HWND comboBoxwindow,
|
||
UINT stringCount,
|
||
INT imageListResourceId = 0,
|
||
INT initialImage = -1
|
||
);
|
||
INT Add(
|
||
WCHAR *string,
|
||
INT image = -1,
|
||
BOOL autoComplete = TRUE,
|
||
BOOL addUnique = TRUE,
|
||
INT indexBefore = -1,
|
||
INT indent = 0
|
||
);
|
||
BOOL Update(
|
||
INT index,
|
||
WCHAR *string,
|
||
INT image = -1
|
||
);
|
||
BOOL Enable();
|
||
|
||
private:
|
||
|
||
HWND Window;
|
||
HIMAGELIST ImageList;
|
||
CreduiStringArray *StringArray;
|
||
};
|
||
|
||
//-----------------------------------------------------------------------------
|
||
// CreduiIconParentWindow Class
|
||
//-----------------------------------------------------------------------------
|
||
|
||
class CreduiIconParentWindow
|
||
{
|
||
public:
|
||
|
||
CreduiIconParentWindow();
|
||
~CreduiIconParentWindow();
|
||
|
||
BOOL Init(HINSTANCE instance, UINT iconResourceId);
|
||
HWND GetWindow() { return Window; }
|
||
|
||
static BOOL Register(HINSTANCE instance);
|
||
static BOOL Unregister();
|
||
|
||
private:
|
||
|
||
HWND Window;
|
||
|
||
static CONST WCHAR *ClassName;
|
||
static HINSTANCE Instance;
|
||
static LONG Registered;
|
||
};
|
||
|
||
|
||
|
||
|
||
//-----------------------------------------------------------------------------
|
||
// CreduiCredentialControl Class
|
||
//-----------------------------------------------------------------------------
|
||
|
||
class CreduiCredentialControl
|
||
{
|
||
public:
|
||
|
||
CreduiCredentialControl();
|
||
~CreduiCredentialControl();
|
||
|
||
static BOOL Register(HINSTANCE instance);
|
||
static BOOL Unregister();
|
||
|
||
virtual BOOL
|
||
OnHelpInfo(
|
||
LPARAM lp
|
||
);
|
||
|
||
|
||
virtual UINT
|
||
MapID(UINT uid);
|
||
|
||
|
||
private:
|
||
|
||
static CONST WCHAR *ClassName;
|
||
static HINSTANCE Instance;
|
||
static LONG Registered;
|
||
|
||
BOOL IsInitialized;
|
||
|
||
// User interface control state flags:
|
||
|
||
enum
|
||
{
|
||
DISABLED_CONTROL = 0x0001,
|
||
DISABLED_CONTROL_PASSWORD = 0x0002,
|
||
DISABLED_CONTROL_USERNAME = 0x0010,
|
||
DISABLED_CONTROL_VIEW = 0x0004,
|
||
DISABLED_CONTROL_SAVE = 0x0008,
|
||
};
|
||
|
||
BOOL DisabledControlMask;
|
||
|
||
// User type image indices:
|
||
|
||
enum
|
||
{
|
||
IMAGE_USERNAME = 0,
|
||
IMAGE_CERT = 1,
|
||
IMAGE_CERT_EXPIRED = 2,
|
||
IMAGE_SMART_CARD = 3,
|
||
IMAGE_SMART_CARD_MISSING = 4,
|
||
IMAGE_SMART_CARD_EXPIRED = 5
|
||
};
|
||
|
||
HWND Window;
|
||
LONG Style;
|
||
|
||
HWND UserNameStaticWindow;
|
||
HWND UserNameControlWindow;
|
||
HWND ViewCertControlWindow;
|
||
HWND PasswordStaticWindow;
|
||
HWND PasswordControlWindow;
|
||
HWND SaveControlWindow;
|
||
|
||
BOOL FirstPaint;
|
||
BOOL ShowBalloonTip;
|
||
CreduiBalloonTip BalloonTip;
|
||
|
||
BOOL IsAutoComplete;
|
||
BOOL NoEditUserName;
|
||
BOOL KeepUserName;
|
||
|
||
BOOL IsPassport;
|
||
|
||
CreduiPasswordBox PasswordBox;
|
||
|
||
UCHAR (*CertHashes)[CERT_HASH_LENGTH];
|
||
ULONG CertCount;
|
||
INT CertBaseInComboBox;
|
||
UCHAR (*UserNameCertHash)[CERT_HASH_LENGTH];
|
||
INT SmartCardBaseInComboBox;
|
||
UINT SmartCardReadCount;
|
||
UINT IsChangingUserName;
|
||
UINT IsChangingPassword;
|
||
|
||
CreduiAutoCompleteComboBox UserNameComboBox;
|
||
|
||
LONG UserNameSelection;
|
||
|
||
HSCARDUI ScardUiHandle;
|
||
|
||
// Functions:
|
||
|
||
BOOL InitWindow();
|
||
BOOL CreateControls();
|
||
BOOL InitComboBoxUserNames();
|
||
BOOL AddCertificates();
|
||
|
||
BOOL ViewCertificate(INT index);
|
||
|
||
BOOL HandleSmartCardMessages(UINT message, CERT_ENUM *certEnum);
|
||
|
||
INT FindSmartCardInComboBox(CERT_ENUM *certEnum);
|
||
VOID RemoveSmartCardFromComboBox(CERT_ENUM *certEnum, BOOL removeParent);
|
||
|
||
VOID Enable(BOOL enable = TRUE);
|
||
|
||
VOID OnUserNameSelectionChange();
|
||
|
||
BOOL OnSetUserNameA(CHAR *userNameA);
|
||
BOOL OnSetUserName(WCHAR *userName);
|
||
|
||
BOOL OnGetUserNameA(CHAR *userNameA, ULONG maxChars);
|
||
BOOL OnGetUserName(WCHAR *userName, ULONG maxChars);
|
||
|
||
BOOL OnSetPasswordA(CHAR *passwordA);
|
||
BOOL OnSetPassword(WCHAR *password);
|
||
|
||
BOOL OnGetPasswordA(CHAR *passwordA, ULONG maxChars);
|
||
BOOL OnGetPassword(WCHAR *password, ULONG maxChars);
|
||
|
||
LONG OnGetUserNameLength();
|
||
|
||
BOOL OnShowBalloonA(CREDUI_BALLOONA *balloonA);
|
||
BOOL OnShowBalloon(CREDUI_BALLOON *balloon);
|
||
|
||
static LRESULT CALLBACK MessageHandlerCallback(
|
||
HWND window,
|
||
UINT message,
|
||
WPARAM wParam,
|
||
LPARAM lParam
|
||
);
|
||
LRESULT
|
||
MessageHandler(
|
||
UINT message,
|
||
WPARAM wParam,
|
||
LPARAM lParam
|
||
);
|
||
|
||
//
|
||
// Command line specific data
|
||
//
|
||
|
||
BOOL DoingCommandLine;
|
||
INT Heartbeats;
|
||
#define CREDUI_HEARTBEAT_TIMER 1
|
||
#define CREDUI_HEARTBEAT_TIMER_VALUE 2000
|
||
#define CREDUI_MAX_HEARTBEATS 5
|
||
|
||
LPWSTR TargetName;
|
||
LPWSTR InitialUserName;
|
||
|
||
void CmdlineSmartCardPrompt();
|
||
void CmdlineSavePrompt();
|
||
|
||
BOOL GetSmartCardInfo(
|
||
IN DWORD SmartCardIndex,
|
||
IN DWORD BufferLength,
|
||
OUT LPWSTR Buffer,
|
||
OUT BOOL *IsValid,
|
||
OUT CERT_ENUM **CertEnum OPTIONAL
|
||
);
|
||
|
||
LPWSTR MatchSmartCard(
|
||
IN DWORD SmartCardCount,
|
||
IN LPWSTR UserName,
|
||
OUT LPDWORD RetCertIndex,
|
||
OUT CERT_ENUM **RetCertEnum
|
||
);
|
||
|
||
};
|
||
|
||
|
||
|
||
//-----------------------------------------------------------------------------
|
||
|
||
#endif // __CONTROLS_HPP__
|