mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
545 lines
17 KiB
545 lines
17 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1997 - 1999
|
|
//
|
|
// File: ccertbmp.cpp
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include "global.hxx"
|
|
#include <dbgdef.h>
|
|
|
|
#define SELPALMODE TRUE
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
CCertificateBmp::CCertificateBmp()
|
|
{
|
|
m_fInitialized = FALSE;
|
|
m_hpal = NULL;
|
|
m_hbmpMiniCertOK = NULL;
|
|
m_hbmpMiniCertNotOK = NULL;
|
|
m_hbmbMiniCertExclamation = NULL;
|
|
m_hbmbPKey = NULL;
|
|
m_hWnd = NULL;
|
|
m_hInst = NULL;
|
|
m_pCertContext = NULL;
|
|
m_dwChainError = 0;
|
|
m_hWindowTextColorBrush = NULL;
|
|
m_hWindowColorBrush = NULL;
|
|
m_h3DLight = NULL;
|
|
m_h3DHighLight = NULL;
|
|
m_h3DLightShadow = NULL;
|
|
m_h3DDarkShadow = NULL;
|
|
m_fNoUsages = FALSE;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
CCertificateBmp::~CCertificateBmp()
|
|
{
|
|
if (m_hpal != NULL)
|
|
{
|
|
::DeleteObject(m_hpal);
|
|
}
|
|
|
|
if (m_hbmpMiniCertOK != NULL)
|
|
{
|
|
::DeleteObject(m_hbmpMiniCertOK);
|
|
}
|
|
|
|
if (m_hbmpMiniCertNotOK != NULL)
|
|
{
|
|
::DeleteObject(m_hbmpMiniCertNotOK);
|
|
}
|
|
|
|
if (m_hbmbMiniCertExclamation != NULL)
|
|
{
|
|
::DeleteObject(m_hbmbMiniCertExclamation);
|
|
}
|
|
|
|
if (m_hbmbPKey != NULL)
|
|
{
|
|
::DeleteObject(m_hbmbPKey);
|
|
}
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
/*BOOL CCertificateBmp::IsTrueErrorString(DWORD dwError)
|
|
{
|
|
BOOL fRet;
|
|
|
|
switch (dwError)
|
|
{
|
|
case CERT_E_CHAINING:
|
|
case TRUST_E_BASIC_CONSTRAINTS:
|
|
case CERT_E_PURPOSE:
|
|
case CERT_E_WRONG_USAGE:
|
|
fRet = FALSE;
|
|
break;
|
|
|
|
default:
|
|
fRet = TRUE;
|
|
break;
|
|
}
|
|
|
|
return fRet;
|
|
}*/
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
void CCertificateBmp::SetChainError(DWORD dwError, BOOL fTrueError, BOOL fNoUsages)
|
|
{
|
|
m_dwChainError = dwError;
|
|
m_fTrueError = fTrueError; //IsTrueErrorString(dwError);
|
|
m_fNoUsages = fNoUsages;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
void CCertificateBmp::SetHinst(HINSTANCE hInst)
|
|
{
|
|
m_hInst = hInst;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
HINSTANCE CCertificateBmp::Hinst()
|
|
{
|
|
return m_hInst;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
void CCertificateBmp::SetWindow(HWND hWnd)
|
|
{
|
|
m_hWnd = hWnd;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
HWND CCertificateBmp::GetMyWindow()
|
|
{
|
|
return m_hWnd;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
LRESULT APIENTRY CCertificateBmpProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
CCertificateBmp* This = (CCertificateBmp*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
|
|
|
|
switch (uMsg)
|
|
{
|
|
case WM_PAINT:
|
|
CallWindowProc((WNDPROC)(This->m_prevProc), hwnd, uMsg, wParam, lParam);
|
|
This->OnPaint();
|
|
break;
|
|
|
|
default:
|
|
return CallWindowProc((WNDPROC)(This->m_prevProc), hwnd, uMsg, wParam, lParam);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
void CCertificateBmp::DoSubclass()
|
|
{
|
|
SetWindowLongPtr(GetMyWindow(), GWLP_USERDATA, (LONG_PTR)this);
|
|
|
|
//
|
|
// hook the window proc so we can get first stab at the messages
|
|
//
|
|
m_prevProc = (WNDPROC)SetWindowLongPtr(GetMyWindow(), GWLP_WNDPROC, (LONG_PTR)CCertificateBmpProc);
|
|
|
|
//
|
|
// Set 'no class cursor' so that SetCursor will work.
|
|
//
|
|
m_hPrevCursor = (HCURSOR)SetClassLongPtr(GetMyWindow(), GCLP_HCURSOR, NULL);
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
void CCertificateBmp::DoUnSubclass()
|
|
{
|
|
if (m_prevProc)
|
|
{
|
|
SetWindowLongPtr(GetMyWindow(), GWLP_WNDPROC, (LONG_PTR)m_prevProc);
|
|
SetWindowLongPtr(GetMyWindow(), GCLP_HCURSOR, (LONG_PTR)m_hPrevCursor);
|
|
m_prevProc = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
void CCertificateBmp::SetRevoked(BOOL fRevoked)
|
|
{
|
|
m_fRevoked = fRevoked;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
BOOL CCertificateBmp::GetRevoked()
|
|
{
|
|
return m_fRevoked;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
void CCertificateBmp::SetCertContext(PCCERT_CONTEXT pCertContext, BOOL fHasPrivateKey)
|
|
{
|
|
m_pCertContext = pCertContext;
|
|
m_fHasPrivateKey = fHasPrivateKey;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
PCCERT_CONTEXT CCertificateBmp::GetCertContext()
|
|
{
|
|
return m_pCertContext;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
void CCertificateBmp::InitializeBmp()
|
|
{
|
|
m_hbmpMiniCertNotOK = LoadResourceBitmap(Hinst(), MAKEINTRESOURCE(IDB_REVOKED_MINICERT), NULL);
|
|
m_hbmpMiniCertOK = LoadResourceBitmap(Hinst(), MAKEINTRESOURCE(IDB_MINICERT), NULL);
|
|
m_hbmbMiniCertExclamation = LoadResourceBitmap(Hinst(), MAKEINTRESOURCE(IDB_EXCLAMATION_MINICERT), NULL);
|
|
m_hbmbPKey = LoadResourceBitmap(Hinst(), MAKEINTRESOURCE(IDB_PRIVATEKEY), NULL);
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
void CCertificateBmp::Initialize()
|
|
{
|
|
if (!m_fInitialized)
|
|
{
|
|
WCHAR szDisplayText[CRYPTUI_MAX_STRING_SIZE];
|
|
WCHAR szURLText[CRYPTUI_MAX_STRING_SIZE];
|
|
|
|
InitCommonControls();
|
|
InitializeBmp();
|
|
|
|
m_fInitialized = TRUE;
|
|
|
|
m_hWindowTextColorBrush = GetSysColorBrush(COLOR_WINDOWTEXT);
|
|
m_hWindowColorBrush = GetSysColorBrush(COLOR_WINDOW);
|
|
m_h3DLight= GetSysColorBrush(COLOR_3DLIGHT);
|
|
m_h3DHighLight = GetSysColorBrush(COLOR_3DHILIGHT);
|
|
m_h3DLightShadow = GetSysColorBrush(COLOR_3DSHADOW);
|
|
m_h3DDarkShadow = GetSysColorBrush(COLOR_3DDKSHADOW);
|
|
}
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
/*
|
|
int CCertificateBmp::OnQueryNewPalette()
|
|
{
|
|
HDC hDC = GetDC(GetMyWindow());
|
|
|
|
HPALETTE hOldPal = SelectPalette(hDC, m_hpal, SELPALMODE);
|
|
int iTemp = RealizePalette(hDC); // Realize drawing palette.
|
|
|
|
SelectPalette(hDC, hOldPal, TRUE);
|
|
RealizePalette(hDC);
|
|
|
|
ReleaseDC(GetMyWindow(), hDC);
|
|
|
|
//
|
|
// Did the realization change?
|
|
//
|
|
if (iTemp)
|
|
{
|
|
InvalidateRect(GetMyWindow(), NULL, FALSE);
|
|
}
|
|
return(iTemp);
|
|
}
|
|
*/
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
void CCertificateBmp::OnPaint()
|
|
{
|
|
Initialize();
|
|
|
|
BITMAP bmMiniCert;
|
|
BITMAP bmPKey;
|
|
|
|
LONG miniCertXY;
|
|
RECT rect;
|
|
RECT disclaimerButtonRect;
|
|
RECT frameRect;
|
|
RECT mainWindowRect;
|
|
RECT borderRect;
|
|
RECT goodForRect;
|
|
LONG borderSpacing;
|
|
|
|
//PAINTSTRUCT ps;
|
|
HDC hdc = GetDC(GetMyWindow());//BeginPaint(GetMyWindow(), &ps);
|
|
if (hdc == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//
|
|
// get the mini bitmap first thing so it can be used to do sizing
|
|
//
|
|
memset(&bmMiniCert, 0, sizeof(bmMiniCert));
|
|
if ((m_dwChainError != 0) && m_fTrueError)
|
|
{
|
|
::GetObject(m_hbmpMiniCertNotOK, sizeof(BITMAP), (LPSTR)&bmMiniCert);
|
|
}
|
|
else if ((m_dwChainError != 0) || m_fNoUsages)
|
|
{
|
|
::GetObject(m_hbmbMiniCertExclamation, sizeof(BITMAP), (LPSTR)&bmMiniCert);
|
|
}
|
|
else
|
|
{
|
|
::GetObject(m_hbmpMiniCertOK, sizeof(BITMAP), (LPSTR)&bmMiniCert);
|
|
}
|
|
|
|
|
|
//
|
|
// calculate where the minicert bmp should be and where the lines should
|
|
// be based on where other controls are
|
|
//
|
|
GetWindowRect(GetDlgItem(m_hWnd, IDC_CERT_GENERAL_HEADER), &rect);
|
|
MapWindowPoints(HWND_DESKTOP, m_hWnd, (LPPOINT) &rect, 2);
|
|
miniCertXY = rect.bottom - bmMiniCert.bmHeight;
|
|
|
|
GetWindowRect(m_hWnd, &mainWindowRect);
|
|
MapWindowPoints(HWND_DESKTOP, m_hWnd, (LPPOINT) &mainWindowRect, 2);
|
|
|
|
GetWindowRect(GetDlgItem(m_hWnd, IDC_DISCLAIMER_BUTTON), &disclaimerButtonRect);
|
|
MapWindowPoints(HWND_DESKTOP, m_hWnd, (LPPOINT) &disclaimerButtonRect, 2);
|
|
|
|
//borderSpacing = mainWindowRect.right - disclaimerButtonRect.right;
|
|
|
|
if ((mainWindowRect.right - disclaimerButtonRect.right) < (miniCertXY - 7))
|
|
{
|
|
borderSpacing = mainWindowRect.right - disclaimerButtonRect.right;
|
|
}
|
|
else
|
|
{
|
|
borderSpacing = miniCertXY - 7;
|
|
}
|
|
|
|
//
|
|
// draw the background by drawing four rectangels. these rectangels
|
|
// border the "what this cert is good for" edit control or the error edit
|
|
// control if there is an error.
|
|
// we have to do this due to a bug in richedit where if you
|
|
// invalidate the entire rect of the control sometimes the scroll
|
|
// bars do not get redrawn.
|
|
//
|
|
if ((m_dwChainError != 0) || m_fNoUsages)
|
|
{
|
|
GetWindowRect(GetDlgItem(m_hWnd, IDC_CERT_GENERAL_ERROR_EDIT), &goodForRect);
|
|
}
|
|
else
|
|
{
|
|
GetWindowRect(GetDlgItem(m_hWnd, IDC_GOODFOR_EDIT), &goodForRect);
|
|
}
|
|
MapWindowPoints(HWND_DESKTOP, m_hWnd, (LPPOINT) &goodForRect, 2);
|
|
rect.left = mainWindowRect.left + borderSpacing;
|
|
rect.right = mainWindowRect.right - borderSpacing;
|
|
rect.bottom = goodForRect.top;
|
|
rect.top = mainWindowRect.top + borderSpacing;
|
|
::FillRect(hdc, &rect, m_hWindowColorBrush);
|
|
|
|
rect.bottom = disclaimerButtonRect.top - borderSpacing;
|
|
rect.top = goodForRect.bottom;
|
|
::FillRect(hdc, &rect, m_hWindowColorBrush);
|
|
|
|
rect.top = goodForRect.top;
|
|
rect.bottom = goodForRect.bottom;
|
|
rect.left = mainWindowRect.left + borderSpacing;
|
|
rect.right = goodForRect.left;
|
|
::FillRect(hdc, &rect, m_hWindowColorBrush);
|
|
|
|
rect.left = goodForRect.right;
|
|
rect.right = mainWindowRect.right - borderSpacing;
|
|
::FillRect(hdc, &rect, m_hWindowColorBrush);
|
|
|
|
//
|
|
// draw the frame
|
|
//
|
|
frameRect.left = mainWindowRect.left + borderSpacing;
|
|
frameRect.right = mainWindowRect.right - borderSpacing;
|
|
frameRect.bottom = disclaimerButtonRect.top - borderSpacing;
|
|
frameRect.top = mainWindowRect.top + borderSpacing;
|
|
|
|
borderRect.left = frameRect.left;
|
|
borderRect.right = frameRect.right - 1;
|
|
borderRect.top = frameRect.top;
|
|
borderRect.bottom = frameRect.top + 1;
|
|
::FillRect(hdc, &borderRect, m_h3DLightShadow);
|
|
borderRect.left = frameRect.left;
|
|
borderRect.right = frameRect.left + 1;
|
|
borderRect.top = frameRect.top;
|
|
borderRect.bottom = frameRect.bottom - 1;
|
|
::FillRect(hdc, &borderRect, m_h3DLightShadow);
|
|
|
|
borderRect.left = frameRect.left + 1;
|
|
borderRect.right = frameRect.right - 2;
|
|
borderRect.top = frameRect.top + 1;
|
|
borderRect.bottom = frameRect.top + 2;
|
|
::FillRect(hdc, &borderRect, m_h3DDarkShadow);
|
|
borderRect.left = frameRect.left + 1;
|
|
borderRect.right = frameRect.left + 2;
|
|
borderRect.top = frameRect.top + 1;
|
|
borderRect.bottom = frameRect.bottom - 2;
|
|
::FillRect(hdc, &borderRect, m_h3DDarkShadow);
|
|
|
|
borderRect.left = frameRect.left;
|
|
borderRect.right = frameRect.right;
|
|
borderRect.top = frameRect.bottom - 1;
|
|
borderRect.bottom = frameRect.bottom;
|
|
::FillRect(hdc, &borderRect, m_h3DHighLight);
|
|
borderRect.left = frameRect.right - 1;
|
|
borderRect.right = frameRect.right;
|
|
borderRect.top = frameRect.top;
|
|
borderRect.bottom = frameRect.bottom;
|
|
::FillRect(hdc, &borderRect, m_h3DHighLight);
|
|
|
|
borderRect.left = frameRect.left + 1;
|
|
borderRect.right = frameRect.right - 1;
|
|
borderRect.top = frameRect.bottom - 2;
|
|
borderRect.bottom = frameRect.bottom - 1;
|
|
::FillRect(hdc, &borderRect, m_h3DLight);
|
|
borderRect.left = frameRect.right - 2;
|
|
borderRect.right = frameRect.right - 1;
|
|
borderRect.top = frameRect.top + 1;
|
|
borderRect.bottom = frameRect.bottom - 1;
|
|
::FillRect(hdc, &borderRect, m_h3DLight);
|
|
|
|
//
|
|
// draw the lines with the proper foreground color
|
|
//
|
|
GetWindowRect(GetDlgItem(m_hWnd, IDC_CERT_GENERAL_HEADER), &rect);
|
|
MapWindowPoints(HWND_DESKTOP, m_hWnd, (LPPOINT) &rect, 2);
|
|
rect.left = mainWindowRect.left + miniCertXY;
|
|
rect.right = mainWindowRect.right - miniCertXY;
|
|
rect.top = rect.bottom + 6;
|
|
rect.bottom = rect.top + 1;
|
|
::FillRect(hdc, &rect, m_hWindowTextColorBrush);
|
|
|
|
GetWindowRect(GetDlgItem(m_hWnd, IDC_SUBJECT_EDIT), &rect);
|
|
MapWindowPoints(HWND_DESKTOP, m_hWnd, (LPPOINT) &rect, 2);
|
|
rect.left = mainWindowRect.left + miniCertXY;
|
|
rect.right = mainWindowRect.right - miniCertXY;
|
|
rect.top -= 10;
|
|
rect.bottom = rect.top + 1;
|
|
::FillRect(hdc, &rect, m_hWindowTextColorBrush);
|
|
|
|
//
|
|
// Draw the mini cert bitmap
|
|
//
|
|
if ((m_dwChainError != 0) && m_fTrueError)
|
|
{
|
|
MaskBlt(m_hbmpMiniCertNotOK,
|
|
m_hpal,
|
|
hdc,
|
|
miniCertXY,
|
|
miniCertXY,
|
|
bmMiniCert.bmWidth,
|
|
bmMiniCert.bmHeight);
|
|
}
|
|
else if ((m_dwChainError != 0) || m_fNoUsages)
|
|
{
|
|
MaskBlt(m_hbmbMiniCertExclamation,
|
|
m_hpal,
|
|
hdc,
|
|
miniCertXY,
|
|
miniCertXY,
|
|
bmMiniCert.bmWidth,
|
|
bmMiniCert.bmHeight);
|
|
}
|
|
else
|
|
{
|
|
MaskBlt(m_hbmpMiniCertOK,
|
|
m_hpal,
|
|
hdc,
|
|
miniCertXY,
|
|
miniCertXY,
|
|
bmMiniCert.bmWidth,
|
|
bmMiniCert.bmHeight);
|
|
}
|
|
|
|
//
|
|
// if there is a private key then draw the bitmap
|
|
//
|
|
if (m_fHasPrivateKey)
|
|
{
|
|
GetWindowRect(GetDlgItem(m_hWnd, IDC_CERT_PRIVATE_KEY_EDIT), &rect);
|
|
MapWindowPoints(HWND_DESKTOP, m_hWnd, (LPPOINT) &rect, 2);
|
|
|
|
memset(&bmPKey, 0, sizeof(bmPKey));
|
|
::GetObject(m_hbmbPKey, sizeof(BITMAP), (LPSTR)&bmPKey);
|
|
MaskBlt(m_hbmbPKey,
|
|
m_hpal,
|
|
hdc,
|
|
rect.left - bmPKey.bmWidth - 4,
|
|
rect.top - 2,
|
|
bmPKey.bmWidth,
|
|
bmPKey.bmHeight);
|
|
}
|
|
|
|
ReleaseDC(GetMyWindow(), hdc);//::EndPaint(GetMyWindow(), &ps);
|
|
|
|
InvalidateRect(GetDlgItem(m_hWnd, IDC_SUBJECT_EDIT), NULL, TRUE);
|
|
InvalidateRect(GetDlgItem(m_hWnd, IDC_ISSUER_EDIT), NULL, TRUE);
|
|
InvalidateRect(GetDlgItem(m_hWnd, IDC_CERT_GENERAL_HEADER), NULL, TRUE);
|
|
InvalidateRect(GetDlgItem(m_hWnd, IDC_CERT_GENERAL_GOODFOR_HEADER), NULL, TRUE);
|
|
InvalidateRect(GetDlgItem(m_hWnd, IDC_CERT_GENERAL_ISSUEDTO_HEADER), NULL, TRUE);
|
|
InvalidateRect(GetDlgItem(m_hWnd, IDC_CERT_GENERAL_ISSUEDBY_HEADER), NULL, TRUE);
|
|
InvalidateRect(GetDlgItem(m_hWnd, IDC_CERT_GENERAL_VALID_EDIT), NULL, TRUE);
|
|
InvalidateRect(GetDlgItem(m_hWnd, IDC_CERT_GENERAL_ERROR_EDIT), NULL, TRUE);
|
|
InvalidateRect(GetDlgItem(m_hWnd, IDC_CERT_ISSUER_WARNING_EDIT), NULL, TRUE);
|
|
InvalidateRect(GetDlgItem(m_hWnd, IDC_CERT_PRIVATE_KEY_EDIT), NULL, TRUE);
|
|
|
|
}
|