570 lines
11 KiB
C++
570 lines
11 KiB
C++
//=============================================================================
|
|
// Copyright (c) 2000 Microsoft Corporation
|
|
//
|
|
// dialogs.hpp
|
|
//
|
|
// Credential manager user interface classes used to get credentials.
|
|
//
|
|
// Created 02/29/2000 johnstep (John Stephens)
|
|
//=============================================================================
|
|
|
|
#ifndef __UTILS_HPP__
|
|
#define __UTILS_HPP__
|
|
|
|
#include <wincrypt.h>
|
|
#include <cryptui.h>
|
|
#include <lm.h>
|
|
|
|
//
|
|
// Determine if the passed in DWORD has precisely one bit set.
|
|
//
|
|
|
|
#define JUST_ONE_BIT( _x ) (((_x) != 0 ) && ( ( (~(_x) + 1) & (_x) ) == (_x) ))
|
|
|
|
// Singly-linked list Structure for holding a cred awaiting confirmation
|
|
typedef struct _CRED_AWAITING_CONFIRMATION
|
|
{
|
|
WCHAR szTargetName[CRED_MAX_STRING_LENGTH+1+CRED_MAX_STRING_LENGTH + 1];
|
|
PCREDENTIAL_TARGET_INFORMATION TargetInfo;
|
|
PCREDENTIAL EncodedCredential;
|
|
DWORD dwCredWriteFlags;
|
|
BOOL DelayCredentialWrite;
|
|
void* pNext; // pointer to next cred in list
|
|
} CRED_AWAITING_CONFIRMATION;
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Functions
|
|
//-----------------------------------------------------------------------------
|
|
|
|
BOOL
|
|
CreduiIsSpecialCredential(
|
|
CREDENTIAL *credential
|
|
);
|
|
|
|
BOOL
|
|
CreduiLookupLocalSidFromRid(
|
|
DWORD rid,
|
|
PSID *sid
|
|
);
|
|
|
|
BOOL
|
|
CreduiLookupLocalNameFromRid(
|
|
DWORD rid,
|
|
LPWSTR *name
|
|
);
|
|
|
|
BOOL
|
|
CreduiGetAdministratorsGroupInfo(
|
|
LOCALGROUP_MEMBERS_INFO_2 **groupInfo,
|
|
DWORD *memberCount
|
|
);
|
|
|
|
BOOL
|
|
CreduiIsRemovableCertificate(
|
|
CONST CERT_CONTEXT *certContext
|
|
);
|
|
|
|
BOOL
|
|
CreduiIsExpiredCertificate(
|
|
CONST CERT_CONTEXT *certContext
|
|
);
|
|
|
|
BOOL
|
|
CreduiIsClientAuthCertificate(
|
|
CONST CERT_CONTEXT *certContext
|
|
);
|
|
|
|
BOOL
|
|
CreduiGetCertificateDisplayName(
|
|
CONST CERT_CONTEXT *certContext,
|
|
WCHAR *displayName,
|
|
ULONG displayNameMaxChars,
|
|
WCHAR *certificateString,
|
|
DWORD dwDisplayType
|
|
);
|
|
|
|
BOOL
|
|
CreduiIsWildcardTargetName(
|
|
WCHAR *targetName
|
|
);
|
|
|
|
BOOL
|
|
CreduiIsPostfixString(
|
|
WCHAR *source,
|
|
WCHAR *postfix
|
|
);
|
|
|
|
// returns TRUE if pszUserName exists as a substring in pszCredential, FALSE if not
|
|
BOOL
|
|
LookForUserNameMatch (
|
|
const WCHAR * pszUserName,
|
|
const WCHAR * pszCredential
|
|
);
|
|
|
|
|
|
// copies the marshalled name of pCert into pszMarshalledName.
|
|
// pszMarshalledName must be at least CREDUI_MAX_USERNAME_LENGTH in length
|
|
//
|
|
// returns TRUE if successful, FALSE if not
|
|
BOOL
|
|
CredUIMarshallNode (
|
|
CERT_ENUM * pCert,
|
|
WCHAR* pszMarshalledName
|
|
);
|
|
|
|
DWORD
|
|
WriteCred(
|
|
IN PCWSTR pszTargetName,
|
|
IN DWORD Flags,
|
|
IN PCREDENTIAL_TARGET_INFORMATION TargetInfo OPTIONAL,
|
|
IN PCREDENTIAL Credential,
|
|
IN DWORD dwCredWriteFlags,
|
|
IN BOOL DelayCredentialWrite,
|
|
IN BOOL EncryptedVisiblePassword
|
|
);
|
|
|
|
|
|
BOOL AddCredToConfirmationList (
|
|
IN PCWSTR pszTargetName,
|
|
IN PCREDENTIAL_TARGET_INFORMATION TargetInfo OPTIONAL,
|
|
IN PCREDENTIAL Credential,
|
|
IN DWORD dwCredWriteFlags,
|
|
IN BOOL DelayCredentialWrite
|
|
);
|
|
|
|
DWORD
|
|
ConfirmCred (
|
|
IN PCWSTR pszTargetName,
|
|
IN BOOL bConfirm,
|
|
IN BOOL bOkToDelete
|
|
);
|
|
|
|
void CleanUpConfirmationList();
|
|
BOOL InitConfirmationList();
|
|
|
|
BOOL IsDeaultSSORealm ( WCHAR* pszTargetName );
|
|
|
|
|
|
#define MAX_SSO_URL_SIZE 4096
|
|
|
|
#define SSOBRAND_X_SIZE 320
|
|
#define SSOBRAND_Y_SIZE 60
|
|
|
|
typedef struct _SSOPACKAGE {
|
|
WCHAR szBrand[MAX_SSO_URL_SIZE];
|
|
WCHAR szURL[MAX_SSO_URL_SIZE];
|
|
WCHAR szAttrib[CRED_MAX_STRING_LENGTH];
|
|
WCHAR szRegURL[MAX_SSO_URL_SIZE];
|
|
WCHAR szHelpURL[MAX_SSO_URL_SIZE];
|
|
DWORD dwRegistrationCompleted; // 0 if not completed, 1 if completed
|
|
DWORD dwNumRegistrationRuns; // number of times we've prompted for registration
|
|
CONST CLSID* pRegistrationWizard; // CLSID of any registration wizard
|
|
} SSOPACKAGE;
|
|
|
|
// Looks in the registry for an SSO entry for the specified package.
|
|
// Fills in the SSOPackage struct and returns TRUE if found. Returns
|
|
// FALSE if no registry entry found
|
|
BOOL
|
|
GetSSOPackageInfo (
|
|
CREDENTIAL_TARGET_INFORMATION* TargetInfo,
|
|
SSOPACKAGE* pSSOStruct
|
|
);
|
|
|
|
|
|
// returns TRUE if it was found, with the value copied to pszRealm.
|
|
// pszRealm is expected to be at least CREDUI_MAX_DOMAIN_TARGET_LENGTH in length
|
|
// returns FALSE if not found
|
|
BOOL ReadPassportRealmFromRegistry (
|
|
WCHAR* pszRealm );
|
|
|
|
|
|
void GetDeaultSSORealm ( WCHAR* pszTargetName, BOOL bForceLookup = TRUE );
|
|
|
|
// returns TRUE if a cred is saved for that realm
|
|
BOOL CheckForSSOCred( WCHAR* pszTargetRealm );
|
|
|
|
DWORD EncryptPassword ( PWSTR pszPassword, PVOID* ppszEncryptedPassword, DWORD* pSize );
|
|
|
|
BOOL IsPasswordEncrypted ( PVOID pPassword, DWORD cbSize );
|
|
|
|
|
|
// Uses GDI+ to load an image as an HBITMAP
|
|
HBITMAP LoadImageFromFileViaGdiPlus(
|
|
PWSTR pszFileName,
|
|
UINT *pcWidth,
|
|
UINT *pcHeight);
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Wincred.h functions
|
|
//
|
|
// these are local mirrors of the credmgr functions so we can handle downlevel cases properly
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Prototypes for Whistler functions
|
|
|
|
typedef
|
|
BOOL
|
|
(WINAPI
|
|
*PFN_CREDWRITEW) (
|
|
IN PCREDENTIALW Credential,
|
|
IN DWORD Flags
|
|
);
|
|
|
|
|
|
typedef
|
|
BOOL
|
|
(WINAPI
|
|
*PFN_CREDREADW) (
|
|
IN LPCWSTR TargetName,
|
|
IN DWORD Type,
|
|
IN DWORD Flags,
|
|
OUT PCREDENTIALW *Credential
|
|
);
|
|
|
|
typedef
|
|
BOOL
|
|
(WINAPI
|
|
*PFN_CREDENUMERATEW) (
|
|
IN LPCWSTR Filter,
|
|
IN DWORD Flags,
|
|
OUT DWORD *Count,
|
|
OUT PCREDENTIALW **Credential
|
|
);
|
|
|
|
|
|
typedef
|
|
BOOL
|
|
(WINAPI
|
|
*PFN_CREDWRITEDOMAINCREDENTIALSW) (
|
|
IN PCREDENTIAL_TARGET_INFORMATIONW TargetInfo,
|
|
IN PCREDENTIALW Credential,
|
|
IN DWORD Flags
|
|
);
|
|
|
|
typedef
|
|
BOOL
|
|
(WINAPI
|
|
*PFN_CREDREADDOMAINCREDENTIALSW) (
|
|
IN PCREDENTIAL_TARGET_INFORMATIONW TargetInfo,
|
|
IN DWORD Flags,
|
|
OUT DWORD *Count,
|
|
OUT PCREDENTIALW **Credential
|
|
);
|
|
|
|
typedef
|
|
BOOL
|
|
(WINAPI
|
|
*PFN_CREDDELETEW) (
|
|
IN LPCWSTR TargetName,
|
|
IN DWORD Type,
|
|
IN DWORD Flags
|
|
);
|
|
|
|
typedef
|
|
BOOL
|
|
(WINAPI
|
|
*PFN_CREDRENAMEW) (
|
|
IN LPCWSTR OldTargetName,
|
|
IN LPCWSTR NewTargetName,
|
|
IN DWORD Type,
|
|
IN DWORD Flags
|
|
);
|
|
|
|
|
|
typedef
|
|
BOOL
|
|
(WINAPI
|
|
*PFN_CREDGETTARGETINFOW) (
|
|
IN LPCWSTR TargetName,
|
|
IN DWORD Flags,
|
|
OUT PCREDENTIAL_TARGET_INFORMATIONW *TargetInfo
|
|
);
|
|
|
|
|
|
typedef
|
|
BOOL
|
|
(WINAPI
|
|
*PFN_CREDMARSHALCREDENTIALW) (
|
|
IN CRED_MARSHAL_TYPE CredType,
|
|
IN PVOID Credential,
|
|
OUT LPWSTR *MarshaledCredential
|
|
);
|
|
|
|
|
|
typedef
|
|
BOOL
|
|
(WINAPI
|
|
*PFN_CREDUNMARSHALCREDENTIALW) (
|
|
IN LPCWSTR MarshaledCredential,
|
|
OUT PCRED_MARSHAL_TYPE CredType,
|
|
OUT PVOID *Credential
|
|
);
|
|
|
|
|
|
typedef
|
|
BOOL
|
|
(WINAPI
|
|
*PFN_CREDISMARSHALEDCREDENTIALW) (
|
|
IN LPCWSTR MarshaledCredential
|
|
);
|
|
|
|
typedef
|
|
BOOL
|
|
(WINAPI
|
|
*PFN_CREDISMARSHALEDCREDENTIALA) (
|
|
IN LPCSTR MarshaledCredential
|
|
);
|
|
|
|
|
|
typedef
|
|
BOOL
|
|
(WINAPI
|
|
*PFN_CREDGETSESSIONTYPES) (
|
|
IN DWORD MaximumPersistCount,
|
|
OUT LPDWORD MaximumPersist
|
|
);
|
|
|
|
typedef
|
|
VOID
|
|
(WINAPI
|
|
*PFN_CREDFREE) (
|
|
IN PVOID Buffer
|
|
);
|
|
|
|
// pointers to Whistler functions
|
|
|
|
extern BOOL bCredMgrAvailable;
|
|
extern PFN_CREDWRITEW pfnCredWriteW;
|
|
extern PFN_CREDREADW pfnCredReadW;
|
|
extern PFN_CREDENUMERATEW pfnCredEnumerateW;
|
|
extern PFN_CREDWRITEDOMAINCREDENTIALSW pfnCredWriteDomainCredentialsW;
|
|
extern PFN_CREDREADDOMAINCREDENTIALSW pfnCredReadDomainCredentialsW;
|
|
extern PFN_CREDDELETEW pfnCredDeleteW;
|
|
extern PFN_CREDRENAMEW pfnCredRenameW;
|
|
extern PFN_CREDGETTARGETINFOW pfnCredGetTargetInfoW;
|
|
extern PFN_CREDMARSHALCREDENTIALW pfnCredMarshalCredentialW;
|
|
extern PFN_CREDUNMARSHALCREDENTIALW pfnCredUnMarshalCredentialW;
|
|
extern PFN_CREDISMARSHALEDCREDENTIALW pfnCredIsMarshaledCredentialW;
|
|
extern PFN_CREDISMARSHALEDCREDENTIALA pfnCredIsMarshaledCredentialA;
|
|
extern PFN_CREDGETSESSIONTYPES pfnCredGetSessionType;
|
|
extern PFN_CREDFREE pfnCredFree;
|
|
|
|
|
|
//////
|
|
// local functions prototypes
|
|
//
|
|
|
|
BOOL
|
|
WINAPI
|
|
LocalCredWriteW (
|
|
IN PCREDENTIALW Credential,
|
|
IN DWORD Flags
|
|
);
|
|
|
|
|
|
BOOL
|
|
WINAPI
|
|
LocalCredReadW (
|
|
IN LPCWSTR TargetName,
|
|
IN DWORD Type,
|
|
IN DWORD Flags,
|
|
OUT PCREDENTIALW *Credential
|
|
);
|
|
|
|
BOOL
|
|
WINAPI
|
|
LocalCredEnumerateW (
|
|
IN LPCWSTR Filter,
|
|
IN DWORD Flags,
|
|
OUT DWORD *Count,
|
|
OUT PCREDENTIALW **Credential
|
|
);
|
|
|
|
|
|
BOOL
|
|
WINAPI
|
|
LocalCredWriteDomainCredentialsW (
|
|
IN PCREDENTIAL_TARGET_INFORMATIONW TargetInfo,
|
|
IN PCREDENTIALW Credential,
|
|
IN DWORD Flags
|
|
);
|
|
|
|
BOOL
|
|
WINAPI
|
|
LocalCredReadDomainCredentialsW (
|
|
IN PCREDENTIAL_TARGET_INFORMATIONW TargetInfo,
|
|
IN DWORD Flags,
|
|
OUT DWORD *Count,
|
|
OUT PCREDENTIALW **Credential
|
|
);
|
|
|
|
BOOL
|
|
WINAPI
|
|
LocalCredDeleteW (
|
|
IN LPCWSTR TargetName,
|
|
IN DWORD Type,
|
|
IN DWORD Flags
|
|
);
|
|
|
|
BOOL
|
|
WINAPI
|
|
LocalCredRenameW (
|
|
IN LPCWSTR OldTargetName,
|
|
IN LPCWSTR NewTargetName,
|
|
IN DWORD Type,
|
|
IN DWORD Flags
|
|
);
|
|
|
|
|
|
BOOL
|
|
WINAPI
|
|
LocalCredGetTargetInfoW (
|
|
IN LPCWSTR TargetName,
|
|
IN DWORD Flags,
|
|
OUT PCREDENTIAL_TARGET_INFORMATIONW *TargetInfo
|
|
);
|
|
|
|
|
|
BOOL
|
|
WINAPI
|
|
LocalCredMarshalCredentialW(
|
|
IN CRED_MARSHAL_TYPE CredType,
|
|
IN PVOID Credential,
|
|
OUT LPWSTR *MarshaledCredential
|
|
);
|
|
|
|
|
|
BOOL
|
|
WINAPI
|
|
LocalCredUnmarshalCredentialW(
|
|
IN LPCWSTR MarshaledCredential,
|
|
OUT PCRED_MARSHAL_TYPE CredType,
|
|
OUT PVOID *Credential
|
|
);
|
|
|
|
|
|
BOOL
|
|
WINAPI
|
|
LocalCredIsMarshaledCredentialW(
|
|
IN LPCWSTR MarshaledCredential
|
|
);
|
|
|
|
BOOL
|
|
WINAPI
|
|
LocalCredIsMarshaledCredentialA(
|
|
IN LPCSTR MarshaledCredential
|
|
);
|
|
|
|
|
|
BOOL
|
|
WINAPI
|
|
LocalCredGetSessionTypes (
|
|
IN DWORD MaximumPersistCount,
|
|
OUT LPDWORD MaximumPersist
|
|
);
|
|
|
|
VOID
|
|
WINAPI
|
|
LocalCredFree (
|
|
IN PVOID Buffer
|
|
);
|
|
|
|
|
|
// function to load pointers
|
|
BOOL
|
|
InitializeCredMgr ();
|
|
|
|
// function to unload lib
|
|
void
|
|
UninitializeCredMgr();
|
|
|
|
VOID
|
|
CredPutStdout(
|
|
IN LPWSTR String
|
|
);
|
|
|
|
VOID
|
|
CredGetStdin(
|
|
OUT LPWSTR Buffer,
|
|
IN DWORD BufferLength,
|
|
IN BOOLEAN EchoChars
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//=============================================================================
|
|
// CreduiIsCapsLockOn
|
|
//
|
|
// Returns TRUE if the Caps Lock key was on at the time the most recent
|
|
// message was posted or FALSE otherwise.
|
|
//
|
|
// Created 02/27/2000 johnstep (John Stephens)
|
|
//=============================================================================
|
|
|
|
inline
|
|
BOOL
|
|
CreduiIsCapsLockOn()
|
|
{
|
|
return (GetKeyState(VK_CAPITAL) & 1) == 1;
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Type of username
|
|
//
|
|
|
|
typedef enum _CREDUI_USERNAME_TYPE {
|
|
CreduiMarshalledUsername, // @@...
|
|
CreduiAbsoluteUsername, // <DomainName>\<UserName>
|
|
CreduiUpn, // <UserName>@<DnsDomainName>
|
|
CreduiRelativeUsername, // <UserName>
|
|
} CREDUI_USERNAME_TYPE, *PCREDUI_USERNAME_TYPE;
|
|
|
|
DWORD
|
|
CredUIParseUserNameWithType(
|
|
CONST WCHAR *UserName,
|
|
WCHAR *user,
|
|
ULONG userMaxChars,
|
|
WCHAR *domain,
|
|
ULONG domainMaxChars,
|
|
PCREDUI_USERNAME_TYPE UsernameType
|
|
);
|
|
|
|
LPWSTR
|
|
GetAccountDomainName(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
CompleteUserName(
|
|
IN OUT LPWSTR UserName,
|
|
IN ULONG UserNameMaxChars,
|
|
IN PCREDENTIAL_TARGET_INFORMATIONW TargetInfo OPTIONAL,
|
|
IN LPWSTR TargetName OPTIONAL,
|
|
IN DWORD Flags
|
|
);
|
|
|
|
|
|
BOOL TryLauchRegWizard (
|
|
SSOPACKAGE* pSSOPackage,
|
|
HWND hwndParent,
|
|
BOOL HasLogonSession,
|
|
WCHAR *userName,
|
|
ULONG userNameMaxChars,
|
|
WCHAR *password,
|
|
ULONG passwordMaxChars,
|
|
DWORD* pResult
|
|
);
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#endif // __UTILS_HPP__
|