299 lines
8.8 KiB
C++
299 lines
8.8 KiB
C++
|
/////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 2000-2001.
|
||
|
//
|
||
|
// File: TemplateV1RequestPropertyPage.cpp
|
||
|
//
|
||
|
// Contents: Implementation of CTemplateV1RequestPropertyPage
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
// TemplateV1RequestPropertyPage.cpp : implementation file
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "TemplateV1RequestPropertyPage.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CTemplateV1RequestPropertyPage property page
|
||
|
enum {
|
||
|
REQUEST_PURPOSE_SIGNATURE = 0,
|
||
|
REQUEST_PURPOSE_ENCRYPTION,
|
||
|
REQUEST_PURPOSE_SIGNATURE_AND_ENCRYPTION
|
||
|
};
|
||
|
|
||
|
CTemplateV1RequestPropertyPage::CTemplateV1RequestPropertyPage(CCertTemplate& rCertTemplate) :
|
||
|
CHelpPropertyPage(CTemplateV1RequestPropertyPage::IDD),
|
||
|
m_rCertTemplate (rCertTemplate)
|
||
|
{
|
||
|
_TRACE (1, L"Entering CTemplateV1RequestPropertyPage::CTemplateV1RequestPropertyPage ()\n");
|
||
|
//{{AFX_DATA_INIT(CTemplateV1RequestPropertyPage)
|
||
|
//}}AFX_DATA_INIT
|
||
|
m_rCertTemplate.AddRef ();
|
||
|
|
||
|
_TRACE (-1, L"Leaving CTemplateV1RequestPropertyPage::CTemplateV1RequestPropertyPage ()\n");
|
||
|
}
|
||
|
|
||
|
CTemplateV1RequestPropertyPage::~CTemplateV1RequestPropertyPage()
|
||
|
{
|
||
|
_TRACE (1, L"Entering CTemplateV1RequestPropertyPage::~CTemplateV1RequestPropertyPage ()\n");
|
||
|
m_rCertTemplate.Release ();
|
||
|
_TRACE (-1, L"Leaving CTemplateV1RequestPropertyPage::~CTemplateV1RequestPropertyPage ()\n");
|
||
|
}
|
||
|
|
||
|
void CTemplateV1RequestPropertyPage::DoDataExchange(CDataExchange* pDX)
|
||
|
{
|
||
|
CHelpPropertyPage::DoDataExchange(pDX);
|
||
|
//{{AFX_DATA_MAP(CTemplateV1RequestPropertyPage)
|
||
|
DDX_Control(pDX, IDC_PURPOSE_COMBO, m_purposeCombo);
|
||
|
DDX_Control(pDX, IDC_CSP_LIST, m_CSPList);
|
||
|
//}}AFX_DATA_MAP
|
||
|
}
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CTemplateV1RequestPropertyPage, CHelpPropertyPage)
|
||
|
//{{AFX_MSG_MAP(CTemplateV1RequestPropertyPage)
|
||
|
ON_CBN_SELCHANGE(IDC_PURPOSE_COMBO, OnSelchangePurposeCombo)
|
||
|
ON_BN_CLICKED(IDC_EXPORT_PRIVATE_KEY, OnExportPrivateKey)
|
||
|
//}}AFX_MSG_MAP
|
||
|
ON_CONTROL(CLBN_CHKCHANGE, IDC_CSP_LIST, OnCheckChange)
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CTemplateV1RequestPropertyPage message handlers
|
||
|
|
||
|
|
||
|
BOOL CTemplateV1RequestPropertyPage::OnInitDialog()
|
||
|
{
|
||
|
_TRACE (1, L"Entering CTemplateV1RequestPropertyPage::OnInitDialog ()\n");
|
||
|
CHelpPropertyPage::OnInitDialog();
|
||
|
|
||
|
CString text;
|
||
|
|
||
|
VERIFY (text.LoadString (IDS_SIGNATURE));
|
||
|
int nIndex = m_purposeCombo.AddString (text);
|
||
|
if ( nIndex >= 0 )
|
||
|
{
|
||
|
m_purposeCombo.SetItemData (nIndex, (DWORD_PTR) REQUEST_PURPOSE_SIGNATURE);
|
||
|
if ( m_rCertTemplate.HasKeySpecSignature () )
|
||
|
m_purposeCombo.SetCurSel (nIndex);
|
||
|
}
|
||
|
|
||
|
VERIFY (text.LoadString (IDS_ENCRYPTION));
|
||
|
nIndex = m_purposeCombo.AddString (text);
|
||
|
if ( nIndex >= 0 )
|
||
|
{
|
||
|
m_purposeCombo.SetItemData (nIndex, (DWORD_PTR) REQUEST_PURPOSE_ENCRYPTION);
|
||
|
if ( m_rCertTemplate.HasEncryptionSignature () )
|
||
|
m_purposeCombo.SetCurSel (nIndex);
|
||
|
}
|
||
|
|
||
|
VERIFY (text.LoadString (IDS_SIGNATURE_AND_ENCRYPTION));
|
||
|
nIndex = m_purposeCombo.AddString (text);
|
||
|
if ( nIndex >= 0 )
|
||
|
{
|
||
|
// NTRAID# 269907 Certificate Template Snap-in: Should set the
|
||
|
// purpose of the template to both signature and encryption if
|
||
|
// CERT_DIGITAL_SIGNATURE_KEY_USAGE is set
|
||
|
bool bHasDigitalSignature = false;
|
||
|
m_rCertTemplate.GetDigitalSignature (bHasDigitalSignature);
|
||
|
|
||
|
m_purposeCombo.SetItemData (nIndex, (DWORD_PTR) REQUEST_PURPOSE_SIGNATURE_AND_ENCRYPTION);
|
||
|
if ( m_rCertTemplate.HasEncryptionSignature () &&
|
||
|
(bHasDigitalSignature || m_rCertTemplate.HasKeySpecSignature ()) )
|
||
|
m_purposeCombo.SetCurSel (nIndex);
|
||
|
}
|
||
|
|
||
|
|
||
|
if ( SUCCEEDED (EnumerateCSPs ()) )
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
if ( m_rCertTemplate.PrivateKeyIsExportable () )
|
||
|
SendDlgItemMessage (IDC_EXPORT_PRIVATE_KEY, BM_SETCHECK, BST_CHECKED);
|
||
|
|
||
|
EnableControls ();
|
||
|
|
||
|
_TRACE (-1, L"Leaving CTemplateV1RequestPropertyPage::OnInitDialog ()\n");
|
||
|
return TRUE; // return TRUE unless you set the focus to a control
|
||
|
// EXCEPTION: OCX Property Pages should return FALSE
|
||
|
}
|
||
|
|
||
|
void CTemplateV1RequestPropertyPage::EnableControls ()
|
||
|
{
|
||
|
GetDlgItem (IDC_PURPOSE_COMBO)->EnableWindow (FALSE);
|
||
|
|
||
|
int nCnt = m_CSPList.GetCount ();
|
||
|
for (int nIndex = 0; nIndex < nCnt; nIndex++)
|
||
|
m_CSPList.Enable (nIndex, FALSE);
|
||
|
|
||
|
GetDlgItem (IDC_EXPORT_PRIVATE_KEY)->EnableWindow (FALSE);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
HRESULT CTemplateV1RequestPropertyPage::EnumerateCSPs()
|
||
|
{
|
||
|
_TRACE (1, L"Entering CTemplateV1RequestPropertyPage::EnumerateCSPs\n");
|
||
|
HRESULT hr = S_OK;
|
||
|
for (DWORD dwIndex = 0; ;dwIndex++)
|
||
|
{
|
||
|
DWORD cbName = 0;
|
||
|
DWORD dwProvType = 0;
|
||
|
|
||
|
if ( CryptEnumProviders (dwIndex, NULL, 0, &dwProvType, NULL, &cbName) )
|
||
|
{
|
||
|
PWSTR pszTypeName = new WCHAR[cbName];
|
||
|
if ( pszTypeName )
|
||
|
{
|
||
|
if ( CryptEnumProviders (dwIndex, NULL, 0, &dwProvType,
|
||
|
pszTypeName, &cbName) )
|
||
|
{
|
||
|
int nIndex = m_CSPList.AddString (pszTypeName);
|
||
|
if ( nIndex < 0 )
|
||
|
{
|
||
|
_TRACE (0, L"AddString (%s) failed: %d\n", nIndex);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = HRESULT_FROM_WIN32 (GetLastError ());
|
||
|
_TRACE (0, L"CryptEnumProviderTypes () failed: 0x%x\n", hr);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
delete [] pszTypeName;
|
||
|
}
|
||
|
else
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = HRESULT_FROM_WIN32 (GetLastError ());
|
||
|
_TRACE (0, L"CryptEnumProviderTypes () failed: 0x%x\n", hr);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int nCSPIndex = 0;
|
||
|
CString szCSP;
|
||
|
while ( SUCCEEDED (m_rCertTemplate.GetCSP (nCSPIndex, szCSP)) )
|
||
|
{
|
||
|
int nIndex = m_CSPList.FindString (-1, szCSP);
|
||
|
if ( CB_ERR != nIndex )
|
||
|
m_CSPList.SetCheck (nIndex, BST_CHECKED);
|
||
|
else
|
||
|
{
|
||
|
// was not found - add it
|
||
|
nIndex = m_CSPList.AddString (szCSP);
|
||
|
if ( nIndex >= 0 )
|
||
|
m_CSPList.SetCheck (nIndex, BST_CHECKED);
|
||
|
}
|
||
|
nCSPIndex++;
|
||
|
}
|
||
|
|
||
|
_TRACE (-1, L"Entering CTemplateV1RequestPropertyPage::EnumerateCSPs: 0x%x\n", hr);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void CTemplateV1RequestPropertyPage::OnSelchangePurposeCombo()
|
||
|
{
|
||
|
int nIndex = m_purposeCombo.GetCurSel ();
|
||
|
if ( nIndex >= 0 )
|
||
|
{
|
||
|
switch (m_purposeCombo.GetItemData (nIndex))
|
||
|
{
|
||
|
case REQUEST_PURPOSE_SIGNATURE:
|
||
|
m_rCertTemplate.SetEncryptionSignature (false);
|
||
|
m_rCertTemplate.SetKeySpecSignature (true);
|
||
|
break;
|
||
|
|
||
|
case REQUEST_PURPOSE_ENCRYPTION:
|
||
|
m_rCertTemplate.SetEncryptionSignature (true);
|
||
|
m_rCertTemplate.SetKeySpecSignature (false);
|
||
|
break;
|
||
|
|
||
|
case REQUEST_PURPOSE_SIGNATURE_AND_ENCRYPTION:
|
||
|
m_rCertTemplate.SetEncryptionSignature (true);
|
||
|
m_rCertTemplate.SetKeySpecSignature (true);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
_ASSERT (0);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
SetModified ();
|
||
|
EnableControls ();
|
||
|
}
|
||
|
|
||
|
void CTemplateV1RequestPropertyPage::OnExportPrivateKey()
|
||
|
{
|
||
|
bool bMakeExportable = (BST_CHECKED == SendDlgItemMessage (IDC_EXPORT_PRIVATE_KEY, BM_GETCHECK));
|
||
|
|
||
|
m_rCertTemplate.MakePrivateKeyExportable (bMakeExportable);
|
||
|
SetModified ();
|
||
|
}
|
||
|
|
||
|
|
||
|
void CTemplateV1RequestPropertyPage::OnCheckChange()
|
||
|
{
|
||
|
int nSel = m_CSPList.GetCurSel ();
|
||
|
if ( nSel >= 0 )
|
||
|
{
|
||
|
CString szCSPName;
|
||
|
|
||
|
m_CSPList.GetText (nSel, szCSPName);
|
||
|
|
||
|
if ( !szCSPName.IsEmpty () )
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
if ( BST_CHECKED == m_CSPList.GetCheck (nSel) )
|
||
|
{
|
||
|
hr = m_rCertTemplate.ModifyCSPList (szCSPName, true); // add
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = m_rCertTemplate.ModifyCSPList (szCSPName, false); // remove
|
||
|
}
|
||
|
if ( SUCCEEDED (hr) )
|
||
|
SetModified ();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CTemplateV1RequestPropertyPage::DoContextHelp (HWND hWndControl)
|
||
|
{
|
||
|
_TRACE(1, L"Entering CTemplateV1RequestPropertyPage::DoContextHelp\n");
|
||
|
|
||
|
switch (::GetDlgCtrlID (hWndControl))
|
||
|
{
|
||
|
case IDC_STATIC:
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
// Display context help for a control
|
||
|
if ( !::WinHelp (
|
||
|
hWndControl,
|
||
|
GetContextHelpFile (),
|
||
|
HELP_WM_HELP,
|
||
|
(DWORD_PTR) g_aHelpIDs_IDD_TEMPLATE_V1_REQUEST) )
|
||
|
{
|
||
|
_TRACE(0, L"WinHelp () failed: 0x%x\n", GetLastError ());
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
_TRACE(-1, L"Leaving CTemplateV1RequestPropertyPage::DoContextHelp\n");
|
||
|
}
|