windows-nt/Source/XPSP1/NT/ds/win32/credui/utils.hpp
2020-09-26 16:20:57 +08:00

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__