862 lines
30 KiB
C++
862 lines
30 KiB
C++
|
/////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 2000-2001.
|
||
|
//
|
||
|
// File: TemplateV2AuthenticationPropertyPage.cpp
|
||
|
//
|
||
|
// Contents: Implementation of CTemplateV2AuthenticationPropertyPage
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
// TemplateV2AuthenticationPropertyPage.cpp : implementation file
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "certtmpl.h"
|
||
|
#include "TemplateV2AuthenticationPropertyPage.h"
|
||
|
#include "AddApprovalDlg.h"
|
||
|
#include "PolicyOID.h"
|
||
|
|
||
|
extern POLICY_OID_LIST g_policyOIDList;
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CTemplateV2AuthenticationPropertyPage property page
|
||
|
|
||
|
CTemplateV2AuthenticationPropertyPage::CTemplateV2AuthenticationPropertyPage(
|
||
|
CCertTemplate& rCertTemplate,
|
||
|
bool& rbIsDirty)
|
||
|
: CHelpPropertyPage(CTemplateV2AuthenticationPropertyPage::IDD),
|
||
|
m_rCertTemplate (rCertTemplate),
|
||
|
m_curApplicationSel (LB_ERR),
|
||
|
m_rbIsDirty (rbIsDirty)
|
||
|
{
|
||
|
//{{AFX_DATA_INIT(CTemplateV2AuthenticationPropertyPage)
|
||
|
//}}AFX_DATA_INIT
|
||
|
m_rCertTemplate.AddRef ();
|
||
|
}
|
||
|
|
||
|
CTemplateV2AuthenticationPropertyPage::~CTemplateV2AuthenticationPropertyPage()
|
||
|
{
|
||
|
m_rCertTemplate.Release ();
|
||
|
}
|
||
|
|
||
|
void CTemplateV2AuthenticationPropertyPage::DoDataExchange(CDataExchange* pDX)
|
||
|
{
|
||
|
CHelpPropertyPage::DoDataExchange(pDX);
|
||
|
//{{AFX_DATA_MAP(CTemplateV2AuthenticationPropertyPage)
|
||
|
DDX_Control(pDX, IDC_APPLICATION_POLICIES, m_applicationPolicyCombo);
|
||
|
DDX_Control(pDX, IDC_POLICY_TYPES, m_policyTypeCombo);
|
||
|
DDX_Control(pDX, IDC_ISSUANCE_POLICIES, m_issuanceList);
|
||
|
//}}AFX_DATA_MAP
|
||
|
}
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CTemplateV2AuthenticationPropertyPage, CHelpPropertyPage)
|
||
|
//{{AFX_MSG_MAP(CTemplateV2AuthenticationPropertyPage)
|
||
|
ON_BN_CLICKED(IDC_ADD_APPROVAL, OnAddApproval)
|
||
|
ON_BN_CLICKED(IDC_REMOVE_APPROVAL, OnRemoveApproval)
|
||
|
ON_EN_CHANGE(IDC_NUM_SIG_REQUIRED_EDIT, OnChangeNumSigRequiredEdit)
|
||
|
ON_BN_CLICKED(IDC_REENROLLMENT_REQUIRES_VALID_CERT, OnAllowReenrollment)
|
||
|
ON_BN_CLICKED(IDC_PEND_ALL_REQUESTS, OnPendAllRequests)
|
||
|
ON_LBN_SELCHANGE(IDC_ISSUANCE_POLICIES, OnSelchangeIssuancePolicies)
|
||
|
ON_CBN_SELCHANGE(IDC_POLICY_TYPES, OnSelchangePolicyTypes)
|
||
|
ON_CBN_SELCHANGE(IDC_APPLICATION_POLICIES, OnSelchangeApplicationPolicies)
|
||
|
ON_WM_DESTROY()
|
||
|
ON_BN_CLICKED(IDC_NUM_SIG_REQUIRED_CHECK, OnNumSigRequiredCheck)
|
||
|
ON_BN_CLICKED(IDC_REENROLLMENT_SAME_AS_ENROLLMENT, OnReenrollmentSameAsEnrollment)
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CTemplateV2AuthenticationPropertyPage message handlers
|
||
|
enum {
|
||
|
POLICY_TYPE_ISSUANCE = 0,
|
||
|
POLICY_TYPE_APPLICATION,
|
||
|
POLICY_TYPE_APPLICATION_AND_ISSUANCE
|
||
|
};
|
||
|
|
||
|
BOOL CTemplateV2AuthenticationPropertyPage::OnInitDialog()
|
||
|
{
|
||
|
_TRACE (1, L"Entering CTemplateV2AuthenticationPropertyPage::OnInitDialog\n");
|
||
|
CHelpPropertyPage::OnInitDialog ();
|
||
|
|
||
|
// Initialize Application Policy combo
|
||
|
for (POSITION nextPos = g_policyOIDList.GetHeadPosition (); nextPos; )
|
||
|
{
|
||
|
CPolicyOID* pPolicyOID = g_policyOIDList.GetNext (nextPos);
|
||
|
if ( pPolicyOID )
|
||
|
{
|
||
|
// If this is the Application OID dialog, show only application
|
||
|
// OIDS, otherwise if this is the Issuance OID dialog, show only
|
||
|
// issuance OIDs
|
||
|
if ( pPolicyOID->IsApplicationOID () )
|
||
|
{
|
||
|
// Bug 262925 CERTSRV: "All Application Policies should be
|
||
|
// removed from Issuance Requirements tab for a cert template
|
||
|
if ( 0 != strcmp (szOID_ANY_APPLICATION_POLICY, pPolicyOID->GetOIDA ()) )
|
||
|
{
|
||
|
int nIndex = m_applicationPolicyCombo.AddString (pPolicyOID->GetDisplayName ());
|
||
|
if ( nIndex >= 0 )
|
||
|
{
|
||
|
LPSTR pszOID = new CHAR[strlen (pPolicyOID->GetOIDA ())+1];
|
||
|
if ( pszOID )
|
||
|
{
|
||
|
strcpy (pszOID, pPolicyOID->GetOIDA ());
|
||
|
m_applicationPolicyCombo.SetItemDataPtr (nIndex, pszOID);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Check for and add pending requests
|
||
|
if ( m_rCertTemplate.PendAllRequests () )
|
||
|
SendDlgItemMessage (IDC_PEND_ALL_REQUESTS, BM_SETCHECK, BST_CHECKED);
|
||
|
|
||
|
// Get the RA Issuance Policies and add them to the issuance list
|
||
|
int nRAPolicyIndex = 0;
|
||
|
CString szRAPolicyOID;
|
||
|
while ( SUCCEEDED (m_rCertTemplate.GetRAIssuancePolicy (nRAPolicyIndex, szRAPolicyOID)) )
|
||
|
{
|
||
|
CString policyName;
|
||
|
int nLen = WideCharToMultiByte(
|
||
|
CP_ACP, // code page
|
||
|
0, // performance and mapping flags
|
||
|
(PCWSTR) szRAPolicyOID, // wide-character string
|
||
|
(int) wcslen (szRAPolicyOID), // number of chars in string
|
||
|
0, // buffer for new string
|
||
|
0, // size of buffer
|
||
|
0, // default for unmappable chars
|
||
|
0); // set when default char used
|
||
|
if ( nLen > 0 )
|
||
|
{
|
||
|
nLen++; // account for Null terminator
|
||
|
PSTR pszAnsiBuf = new CHAR[nLen];
|
||
|
if ( pszAnsiBuf )
|
||
|
{
|
||
|
ZeroMemory (pszAnsiBuf, nLen*sizeof(CHAR));
|
||
|
nLen = WideCharToMultiByte(
|
||
|
CP_ACP, // code page
|
||
|
0, // performance and mapping flags
|
||
|
(PCWSTR) szRAPolicyOID, // wide-character string
|
||
|
(int) wcslen (szRAPolicyOID), // number of chars in string
|
||
|
pszAnsiBuf, // buffer for new string
|
||
|
nLen, // size of buffer
|
||
|
0, // default for unmappable chars
|
||
|
0); // set when default char used
|
||
|
if ( nLen )
|
||
|
{
|
||
|
if ( MyGetOIDInfoA (policyName, pszAnsiBuf) )
|
||
|
{
|
||
|
int nIndex = m_issuanceList.AddString (policyName);
|
||
|
if ( nIndex >= 0 )
|
||
|
m_issuanceList.SetItemData (nIndex, (DWORD_PTR) pszAnsiBuf);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
_TRACE (0, L"WideCharToMultiByte (%s) failed: 0x%x\n",
|
||
|
(PCWSTR) szRAPolicyOID, GetLastError ());
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
break;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
_TRACE (0, L"WideCharToMultiByte (%s) failed: 0x%x\n",
|
||
|
(PCWSTR) szRAPolicyOID, GetLastError ());
|
||
|
}
|
||
|
|
||
|
nRAPolicyIndex++;
|
||
|
}
|
||
|
|
||
|
// Get the RA Application policy and select it
|
||
|
// in the application combo
|
||
|
nRAPolicyIndex = 0;
|
||
|
while ( SUCCEEDED (m_rCertTemplate.GetRAApplicationPolicy (nRAPolicyIndex, szRAPolicyOID)) )
|
||
|
{
|
||
|
CString policyName;
|
||
|
int nLen = WideCharToMultiByte(
|
||
|
CP_ACP, // code page
|
||
|
0, // performance and mapping flags
|
||
|
(PCWSTR) szRAPolicyOID, // wide-character string
|
||
|
(int) wcslen (szRAPolicyOID), // number of chars in string
|
||
|
0, // buffer for new string
|
||
|
0, // size of buffer
|
||
|
0, // default for unmappable chars
|
||
|
0); // set when default char used
|
||
|
if ( nLen > 0 )
|
||
|
{
|
||
|
nLen++; // account for Null terminator
|
||
|
PSTR pszAnsiBuf = new CHAR[nLen];
|
||
|
if ( pszAnsiBuf )
|
||
|
{
|
||
|
ZeroMemory (pszAnsiBuf, nLen*sizeof(CHAR));
|
||
|
nLen = WideCharToMultiByte(
|
||
|
CP_ACP, // code page
|
||
|
0, // performance and mapping flags
|
||
|
(PCWSTR) szRAPolicyOID, // wide-character string
|
||
|
(int) wcslen (szRAPolicyOID), // number of chars in string
|
||
|
pszAnsiBuf, // buffer for new string
|
||
|
nLen, // size of buffer
|
||
|
0, // default for unmappable chars
|
||
|
0); // set when default char used
|
||
|
if ( nLen )
|
||
|
{
|
||
|
if ( MyGetOIDInfoA (policyName, pszAnsiBuf) )
|
||
|
{
|
||
|
int nIndex = m_applicationPolicyCombo.FindStringExact (-1, policyName);
|
||
|
if ( nIndex >= 0 )
|
||
|
m_applicationPolicyCombo.SetCurSel (nIndex);
|
||
|
m_curApplicationSel = nIndex;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
_TRACE (0, L"WideCharToMultiByte (%s) failed: 0x%x\n",
|
||
|
(PCWSTR) szRAPolicyOID, GetLastError ());
|
||
|
}
|
||
|
delete [] pszAnsiBuf;
|
||
|
}
|
||
|
else
|
||
|
break;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
_TRACE (0, L"WideCharToMultiByte (%s) failed: 0x%x\n",
|
||
|
(PCWSTR) szRAPolicyOID, GetLastError ());
|
||
|
}
|
||
|
|
||
|
nRAPolicyIndex++;
|
||
|
}
|
||
|
|
||
|
// Initialize "Policy Type" combo box
|
||
|
CString text;
|
||
|
int nApplicationSel = m_applicationPolicyCombo.GetCurSel ();
|
||
|
int nIssuanceCnt = m_issuanceList.GetCount ();
|
||
|
|
||
|
VERIFY (text.LoadString (IDS_ISSUANCE_POLICY));
|
||
|
int nIndex = m_policyTypeCombo.AddString (text);
|
||
|
if ( nIndex >= 0 )
|
||
|
{
|
||
|
m_policyTypeCombo.SetItemData (nIndex, POLICY_TYPE_ISSUANCE);
|
||
|
if ( LB_ERR == nApplicationSel && nIssuanceCnt > 0 )
|
||
|
m_policyTypeCombo.SetCurSel (nIndex);
|
||
|
}
|
||
|
|
||
|
VERIFY (text.LoadString (IDS_APPLICATION_POLICY));
|
||
|
nIndex = m_policyTypeCombo.AddString (text);
|
||
|
if ( nIndex >= 0 )
|
||
|
{
|
||
|
m_policyTypeCombo.SetItemData (nIndex, POLICY_TYPE_APPLICATION);
|
||
|
if ( nApplicationSel >= 0 && 0 == nIssuanceCnt )
|
||
|
m_policyTypeCombo.SetCurSel (nIndex);
|
||
|
}
|
||
|
|
||
|
VERIFY (text.LoadString (IDS_APPLICATION_AND_ISSUANCE_POLICY));
|
||
|
nIndex = m_policyTypeCombo.AddString (text);
|
||
|
if ( nIndex >= 0 )
|
||
|
{
|
||
|
m_policyTypeCombo.SetItemData (nIndex, POLICY_TYPE_APPLICATION_AND_ISSUANCE);
|
||
|
if ( nApplicationSel >= 0 && nIssuanceCnt > 0 )
|
||
|
m_policyTypeCombo.SetCurSel (nIndex);
|
||
|
}
|
||
|
|
||
|
|
||
|
DWORD dwNumSignatures = 0;
|
||
|
if ( SUCCEEDED (m_rCertTemplate.GetRANumSignaturesRequired (dwNumSignatures)) )
|
||
|
SetDlgItemInt (IDC_NUM_SIG_REQUIRED_EDIT, dwNumSignatures);
|
||
|
|
||
|
if ( dwNumSignatures > 0 )
|
||
|
SendDlgItemMessage (IDC_NUM_SIG_REQUIRED_CHECK, BM_SETCHECK, BST_CHECKED);
|
||
|
|
||
|
if ( m_rCertTemplate.ReenrollmentValidWithPreviousApproval () )
|
||
|
SendDlgItemMessage (IDC_REENROLLMENT_REQUIRES_VALID_CERT, BM_SETCHECK, BST_CHECKED);
|
||
|
else
|
||
|
SendDlgItemMessage (IDC_REENROLLMENT_SAME_AS_ENROLLMENT, BM_SETCHECK, BST_CHECKED);
|
||
|
|
||
|
EnableControls ();
|
||
|
|
||
|
_TRACE (-1, L"Leaving CTemplateV2AuthenticationPropertyPage::OnInitDialog\n");
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
void CTemplateV2AuthenticationPropertyPage::OnAddApproval()
|
||
|
{
|
||
|
// Create the list of already added approvals. These will not be displayed
|
||
|
// in the Add Approval dialog.
|
||
|
int nCnt = m_issuanceList.GetCount ();
|
||
|
PSTR* paszUsedApprovals = 0;
|
||
|
|
||
|
|
||
|
// allocate an array of PSTR pointers and add each item.
|
||
|
// Set the last to NULL
|
||
|
if ( nCnt )
|
||
|
{
|
||
|
paszUsedApprovals = new PSTR[nCnt+1];
|
||
|
if ( paszUsedApprovals )
|
||
|
{
|
||
|
::ZeroMemory (paszUsedApprovals, sizeof (PSTR) * (nCnt+1));
|
||
|
while (--nCnt >= 0)
|
||
|
{
|
||
|
PSTR pszPolicyOID = (PSTR) m_issuanceList.GetItemData (nCnt);
|
||
|
if ( pszPolicyOID )
|
||
|
{
|
||
|
PSTR pNewStr = new CHAR[strlen (pszPolicyOID) + 1];
|
||
|
if ( pNewStr )
|
||
|
{
|
||
|
strcpy (pNewStr, pszPolicyOID);
|
||
|
paszUsedApprovals[nCnt] = pNewStr;
|
||
|
}
|
||
|
else
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CAddApprovalDlg dlg (this, paszUsedApprovals);
|
||
|
|
||
|
CThemeContextActivator activator;
|
||
|
if ( IDOK == dlg.DoModal () && dlg.m_paszReturnedApprovals )
|
||
|
{
|
||
|
for (int nIndex = 0; dlg.m_paszReturnedApprovals[nIndex]; nIndex++)
|
||
|
{
|
||
|
SetModified ();
|
||
|
m_rbIsDirty = true;
|
||
|
|
||
|
// Add to template RA list
|
||
|
CString szRAPolicyOID (dlg.m_paszReturnedApprovals[nIndex]);
|
||
|
HRESULT hr = m_rCertTemplate.ModifyRAIssuancePolicyList (szRAPolicyOID, true);
|
||
|
ASSERT (SUCCEEDED (hr));
|
||
|
if ( SUCCEEDED (hr) )
|
||
|
{
|
||
|
// Add to list
|
||
|
CString policyName;
|
||
|
if ( MyGetOIDInfoA (policyName, dlg.m_paszReturnedApprovals[nIndex]) )
|
||
|
{
|
||
|
int nAddedIndex = m_issuanceList.AddString (policyName);
|
||
|
if ( nAddedIndex >= 0 )
|
||
|
{
|
||
|
PSTR pszAnsiBuf = new CHAR[strlen (dlg.m_paszReturnedApprovals[nIndex]) + 1];
|
||
|
if ( pszAnsiBuf )
|
||
|
{
|
||
|
strcpy (pszAnsiBuf, dlg.m_paszReturnedApprovals[nIndex]);
|
||
|
m_issuanceList.SetItemData (nAddedIndex, (DWORD_PTR) pszAnsiBuf);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( paszUsedApprovals )
|
||
|
{
|
||
|
for (int nIndex = 0; paszUsedApprovals[nIndex]; nIndex++)
|
||
|
delete [] paszUsedApprovals[nIndex];
|
||
|
delete [] paszUsedApprovals;
|
||
|
}
|
||
|
|
||
|
EnableControls ();
|
||
|
}
|
||
|
|
||
|
|
||
|
void CTemplateV2AuthenticationPropertyPage::OnRemoveApproval()
|
||
|
{
|
||
|
int nSelCnt = m_issuanceList.GetSelCount ();
|
||
|
int* pnSelIndexes = new int[nSelCnt];
|
||
|
if ( pnSelIndexes )
|
||
|
{
|
||
|
m_issuanceList.GetSelItems (nSelCnt, pnSelIndexes);
|
||
|
for (int nIndex = nSelCnt-1; nIndex >= 0; nIndex--)
|
||
|
{
|
||
|
PSTR pszPolicyOID = (PSTR) m_issuanceList.GetItemData (pnSelIndexes[nIndex]);
|
||
|
if ( pszPolicyOID )
|
||
|
{
|
||
|
HRESULT hr = m_rCertTemplate.ModifyRAIssuancePolicyList (pszPolicyOID, false);
|
||
|
if ( SUCCEEDED (hr) )
|
||
|
VERIFY (m_issuanceList.DeleteString (pnSelIndexes[nIndex]));
|
||
|
else
|
||
|
{
|
||
|
CString text;
|
||
|
CString caption;
|
||
|
CThemeContextActivator activator;
|
||
|
|
||
|
VERIFY (caption.LoadString (IDS_CERTTMPL));
|
||
|
text.FormatMessage (IDS_CANNOT_DELETE_ISSUANCE_RA, GetSystemMessage (hr));
|
||
|
MessageBox (text, caption, MB_OK | MB_ICONWARNING);
|
||
|
delete [] pszPolicyOID;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
delete [] pnSelIndexes;
|
||
|
}
|
||
|
SetModified ();
|
||
|
m_rbIsDirty = true;
|
||
|
}
|
||
|
|
||
|
void CTemplateV2AuthenticationPropertyPage::EnableControls()
|
||
|
{
|
||
|
if ( m_rCertTemplate.ReadOnly () )
|
||
|
{
|
||
|
GetDlgItem (IDC_PEND_ALL_REQUESTS)->EnableWindow (FALSE);
|
||
|
m_policyTypeCombo.EnableWindow (FALSE);
|
||
|
m_issuanceList.EnableWindow (FALSE);
|
||
|
m_applicationPolicyCombo.EnableWindow (FALSE);
|
||
|
GetDlgItem (IDC_ADD_APPROVAL)->EnableWindow (FALSE);
|
||
|
GetDlgItem (IDC_REMOVE_APPROVAL)->EnableWindow (FALSE);
|
||
|
GetDlgItem (IDC_NUM_SIG_REQUIRED_EDIT)->EnableWindow (FALSE);
|
||
|
GetDlgItem (IDC_REENROLLMENT_REQUIRES_VALID_CERT)->EnableWindow (FALSE);
|
||
|
GetDlgItem (IDC_REENROLLMENT_SAME_AS_ENROLLMENT)->EnableWindow (FALSE);
|
||
|
GetDlgItem (IDC_REENROLLMENT_REQUIRES_VALID_CERT)->EnableWindow (FALSE);
|
||
|
GetDlgItem (IDC_REENROLLMENT_SAME_AS_ENROLLMENT)->EnableWindow (FALSE);
|
||
|
GetDlgItem (IDC_NUM_SIG_REQUIRED_CHECK)->EnableWindow (FALSE);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
BOOL bEnable = (BST_CHECKED == SendDlgItemMessage (IDC_NUM_SIG_REQUIRED_CHECK, BM_GETCHECK));
|
||
|
|
||
|
EnablePolicyControls (bEnable);
|
||
|
|
||
|
if ( bEnable )
|
||
|
{
|
||
|
int nCnt = m_issuanceList.GetCount ();
|
||
|
int nSel = m_issuanceList.GetSelCount ();
|
||
|
|
||
|
|
||
|
switch (m_policyTypeCombo.GetItemData (m_policyTypeCombo.GetCurSel ()))
|
||
|
{
|
||
|
case POLICY_TYPE_ISSUANCE:
|
||
|
m_issuanceList.EnableWindow (TRUE);
|
||
|
GetDlgItem (IDC_ADD_APPROVAL)->EnableWindow (TRUE);
|
||
|
GetDlgItem (IDC_REMOVE_APPROVAL)->EnableWindow (TRUE);
|
||
|
GetDlgItem (IDC_ISSUANCE_POLICY_LABEL)->EnableWindow (TRUE);
|
||
|
m_applicationPolicyCombo.EnableWindow (FALSE);
|
||
|
GetDlgItem (IDC_APP_POLICY_LABEL)->EnableWindow (FALSE);
|
||
|
break;
|
||
|
|
||
|
case POLICY_TYPE_APPLICATION:
|
||
|
m_issuanceList.EnableWindow (FALSE);
|
||
|
GetDlgItem (IDC_ADD_APPROVAL)->EnableWindow (FALSE);
|
||
|
GetDlgItem (IDC_REMOVE_APPROVAL)->EnableWindow (FALSE);
|
||
|
GetDlgItem (IDC_ISSUANCE_POLICY_LABEL)->EnableWindow (FALSE);
|
||
|
m_applicationPolicyCombo.EnableWindow (TRUE);
|
||
|
GetDlgItem (IDC_APP_POLICY_LABEL)->EnableWindow (TRUE);
|
||
|
break;
|
||
|
|
||
|
case POLICY_TYPE_APPLICATION_AND_ISSUANCE:
|
||
|
m_issuanceList.EnableWindow (TRUE);
|
||
|
GetDlgItem (IDC_ADD_APPROVAL)->EnableWindow (TRUE);
|
||
|
GetDlgItem (IDC_REMOVE_APPROVAL)->EnableWindow (nSel > 0 && nCnt > nSel);
|
||
|
GetDlgItem (IDC_ISSUANCE_POLICY_LABEL)->EnableWindow (TRUE);
|
||
|
m_applicationPolicyCombo.EnableWindow (TRUE);
|
||
|
GetDlgItem (IDC_APP_POLICY_LABEL)->EnableWindow (TRUE);
|
||
|
break;
|
||
|
|
||
|
default: // nothing selected
|
||
|
m_issuanceList.EnableWindow (FALSE);
|
||
|
GetDlgItem (IDC_ADD_APPROVAL)->EnableWindow (FALSE);
|
||
|
GetDlgItem (IDC_REMOVE_APPROVAL)->EnableWindow (FALSE);
|
||
|
GetDlgItem (IDC_ISSUANCE_POLICY_LABEL)->EnableWindow (FALSE);
|
||
|
m_applicationPolicyCombo.EnableWindow (FALSE);
|
||
|
GetDlgItem (IDC_APP_POLICY_LABEL)->EnableWindow (FALSE);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CTemplateV2AuthenticationPropertyPage::OnChangeNumSigRequiredEdit()
|
||
|
{
|
||
|
static bool bProcessingOnChangeNumSigRequiredEdit = false;
|
||
|
|
||
|
if ( !bProcessingOnChangeNumSigRequiredEdit )
|
||
|
{
|
||
|
bProcessingOnChangeNumSigRequiredEdit = true;
|
||
|
CString szText;
|
||
|
|
||
|
if ( GetDlgItemText (IDC_NUM_SIG_REQUIRED_EDIT, szText) > 0 )
|
||
|
{
|
||
|
DWORD dwNumSignatures = GetDlgItemInt (IDC_NUM_SIG_REQUIRED_EDIT);
|
||
|
DWORD dwFormerNumSignatures = 0;
|
||
|
m_rCertTemplate.GetRANumSignaturesRequired (dwFormerNumSignatures);
|
||
|
|
||
|
if ( dwFormerNumSignatures != dwNumSignatures )
|
||
|
{
|
||
|
HRESULT hr = m_rCertTemplate.SetRANumSignaturesRequired (dwNumSignatures);
|
||
|
if ( SUCCEEDED (hr) )
|
||
|
{
|
||
|
if ( 0 == dwFormerNumSignatures ||
|
||
|
0 == dwNumSignatures )
|
||
|
{
|
||
|
OnNumSigRequiredCheck();
|
||
|
}
|
||
|
|
||
|
SetModified ();
|
||
|
m_rbIsDirty = true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bProcessingOnChangeNumSigRequiredEdit = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CTemplateV2AuthenticationPropertyPage::OnAllowReenrollment()
|
||
|
{
|
||
|
HRESULT hr = m_rCertTemplate.SetReenrollmentValidWithPreviousApproval (
|
||
|
BST_CHECKED == SendDlgItemMessage (IDC_REENROLLMENT_REQUIRES_VALID_CERT, BM_GETCHECK));
|
||
|
if ( SUCCEEDED (hr) )
|
||
|
{
|
||
|
SetModified ();
|
||
|
m_rbIsDirty = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void CTemplateV2AuthenticationPropertyPage::DoContextHelp (HWND hWndControl)
|
||
|
{
|
||
|
_TRACE(1, L"Entering CTemplateV2AuthenticationPropertyPage::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_V2_AUTHENTICATION) )
|
||
|
{
|
||
|
_TRACE(0, L"WinHelp () failed: 0x%x\n", GetLastError ());
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
_TRACE(-1, L"Leaving CTemplateV2AuthenticationPropertyPage::DoContextHelp\n");
|
||
|
}
|
||
|
|
||
|
void CTemplateV2AuthenticationPropertyPage::OnPendAllRequests()
|
||
|
{
|
||
|
m_rCertTemplate.SetPendAllRequests (
|
||
|
BST_CHECKED == SendDlgItemMessage (IDC_PEND_ALL_REQUESTS, BM_GETCHECK));
|
||
|
SetModified ();
|
||
|
m_rbIsDirty = true;
|
||
|
}
|
||
|
|
||
|
void CTemplateV2AuthenticationPropertyPage::OnSelchangeIssuancePolicies()
|
||
|
{
|
||
|
EnableControls ();
|
||
|
}
|
||
|
|
||
|
void CTemplateV2AuthenticationPropertyPage::OnSelchangePolicyTypes()
|
||
|
{
|
||
|
SetModified ();
|
||
|
m_rbIsDirty = true;
|
||
|
|
||
|
switch (m_policyTypeCombo.GetItemData (m_policyTypeCombo.GetCurSel ()))
|
||
|
{
|
||
|
case POLICY_TYPE_ISSUANCE:
|
||
|
{
|
||
|
// Unselect the application policy and inform the user that
|
||
|
// an issuance policy must be added if there aren't any
|
||
|
int nSel = m_applicationPolicyCombo.GetCurSel ();
|
||
|
if ( nSel >= 0 )
|
||
|
{
|
||
|
PSTR pszOID = (PSTR) m_applicationPolicyCombo.GetItemDataPtr (nSel);
|
||
|
if ( pszOID )
|
||
|
{
|
||
|
HRESULT hr = m_rCertTemplate.ModifyRAApplicationPolicyList (pszOID, false);
|
||
|
_ASSERT (SUCCEEDED (hr));
|
||
|
if ( SUCCEEDED (hr) )
|
||
|
{
|
||
|
SetModified ();
|
||
|
m_rbIsDirty = true;
|
||
|
}
|
||
|
}
|
||
|
m_applicationPolicyCombo.SetCurSel (LB_ERR);
|
||
|
m_curApplicationSel = LB_ERR;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case POLICY_TYPE_APPLICATION:
|
||
|
{
|
||
|
// Select an application policy, if necessary and remove
|
||
|
// the issuance policies
|
||
|
int nSel = m_applicationPolicyCombo.GetCurSel ();
|
||
|
if ( LB_ERR == nSel )
|
||
|
{
|
||
|
m_applicationPolicyCombo.SetCurSel (0);
|
||
|
nSel = m_applicationPolicyCombo.GetCurSel ();
|
||
|
m_curApplicationSel = nSel;
|
||
|
if ( nSel >= 0 )
|
||
|
{
|
||
|
PSTR pszOID = (PSTR) m_applicationPolicyCombo.GetItemDataPtr (nSel);
|
||
|
if ( pszOID )
|
||
|
{
|
||
|
HRESULT hr = m_rCertTemplate.ModifyRAApplicationPolicyList (pszOID, true);
|
||
|
_ASSERT (SUCCEEDED (hr));
|
||
|
if ( SUCCEEDED (hr) )
|
||
|
{
|
||
|
SetModified ();
|
||
|
m_rbIsDirty = true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ClearIssuanceList ();
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case POLICY_TYPE_APPLICATION_AND_ISSUANCE:
|
||
|
{
|
||
|
// Select an application policy, if necessary and inform the user
|
||
|
// that an issuance policy must be added, if there aren't any.
|
||
|
int nSel = m_applicationPolicyCombo.GetCurSel ();
|
||
|
if ( LB_ERR == nSel )
|
||
|
{
|
||
|
m_applicationPolicyCombo.SetCurSel (0);
|
||
|
nSel = m_applicationPolicyCombo.GetCurSel ();
|
||
|
m_curApplicationSel = nSel;
|
||
|
if ( nSel >= 0 )
|
||
|
{
|
||
|
PSTR pszOID = (PSTR) m_applicationPolicyCombo.GetItemDataPtr (nSel);
|
||
|
if ( pszOID )
|
||
|
{
|
||
|
HRESULT hr = m_rCertTemplate.ModifyRAApplicationPolicyList (pszOID, true);
|
||
|
_ASSERT (SUCCEEDED (hr));
|
||
|
if ( SUCCEEDED (hr) )
|
||
|
{
|
||
|
SetModified ();
|
||
|
m_rbIsDirty = true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
default: // nothing selected
|
||
|
break;
|
||
|
}
|
||
|
EnableControls ();
|
||
|
}
|
||
|
|
||
|
void CTemplateV2AuthenticationPropertyPage::OnSelchangeApplicationPolicies()
|
||
|
{
|
||
|
int nNewSel = m_applicationPolicyCombo.GetCurSel ();
|
||
|
|
||
|
// Remove the old application OID and add the new one
|
||
|
if ( m_curApplicationSel != nNewSel )
|
||
|
{
|
||
|
if ( LB_ERR != m_curApplicationSel )
|
||
|
{
|
||
|
LPSTR pszOID = (LPSTR) m_applicationPolicyCombo.GetItemDataPtr (m_curApplicationSel);
|
||
|
if ( pszOID )
|
||
|
{
|
||
|
HRESULT hr = m_rCertTemplate.ModifyRAApplicationPolicyList (pszOID, false);
|
||
|
_ASSERT (SUCCEEDED (hr));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( LB_ERR != nNewSel )
|
||
|
{
|
||
|
LPSTR pszOID = (LPSTR) m_applicationPolicyCombo.GetItemDataPtr (nNewSel);
|
||
|
if ( pszOID )
|
||
|
{
|
||
|
HRESULT hr = m_rCertTemplate.ModifyRAApplicationPolicyList (pszOID, true);
|
||
|
_ASSERT (SUCCEEDED (hr));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
SetModified ();
|
||
|
m_rbIsDirty = true;
|
||
|
|
||
|
m_curApplicationSel = nNewSel;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CTemplateV2AuthenticationPropertyPage::OnDestroy()
|
||
|
{
|
||
|
int nCnt = m_issuanceList.GetCount ();
|
||
|
for (int nIndex = 0; nIndex < nCnt; nIndex++)
|
||
|
{
|
||
|
PSTR pszBuf = (PSTR) m_issuanceList.GetItemData (nIndex);
|
||
|
if ( pszBuf )
|
||
|
delete [] pszBuf;
|
||
|
}
|
||
|
|
||
|
|
||
|
nCnt = m_applicationPolicyCombo.GetCount ();
|
||
|
for (int nIndex = 0; nIndex < nCnt; nIndex++)
|
||
|
{
|
||
|
PSTR pszOID = (PSTR) m_applicationPolicyCombo.GetItemDataPtr (nIndex);
|
||
|
if ( pszOID )
|
||
|
delete [] pszOID;
|
||
|
}
|
||
|
|
||
|
CHelpPropertyPage::OnDestroy();
|
||
|
}
|
||
|
|
||
|
void CTemplateV2AuthenticationPropertyPage::OnNumSigRequiredCheck()
|
||
|
{
|
||
|
static bProcessingOnNumSigRequiredCheck = false;
|
||
|
|
||
|
if ( !bProcessingOnNumSigRequiredCheck ) // to prevent reentrancy
|
||
|
{
|
||
|
bProcessingOnNumSigRequiredCheck = true;
|
||
|
if ( BST_UNCHECKED == SendDlgItemMessage (IDC_NUM_SIG_REQUIRED_CHECK, BM_GETCHECK) )
|
||
|
{
|
||
|
if ( 0 != GetDlgItemInt (IDC_NUM_SIG_REQUIRED_EDIT) )
|
||
|
SetDlgItemInt (IDC_NUM_SIG_REQUIRED_EDIT, 0);
|
||
|
|
||
|
// NTRAID# 369551 CertTmpl:UI does not clean up changed settings
|
||
|
// clear out policy type combo, application policy combo and issuance
|
||
|
// policy list
|
||
|
m_policyTypeCombo.SetCurSel (-1);
|
||
|
m_policyTypeCombo.Clear ();
|
||
|
|
||
|
// Clear application policy
|
||
|
int nCurSel = m_applicationPolicyCombo.GetCurSel ();
|
||
|
if ( LB_ERR != nCurSel )
|
||
|
{
|
||
|
// Remove the old application OID
|
||
|
LPSTR pszOID = (LPSTR) m_applicationPolicyCombo.GetItemDataPtr (nCurSel);
|
||
|
if ( pszOID )
|
||
|
{
|
||
|
HRESULT hr = m_rCertTemplate.ModifyRAApplicationPolicyList (pszOID, false);
|
||
|
_ASSERT (SUCCEEDED (hr));
|
||
|
}
|
||
|
}
|
||
|
m_applicationPolicyCombo.SetCurSel (-1);
|
||
|
m_applicationPolicyCombo.Clear ();
|
||
|
|
||
|
// Clear issuance policy
|
||
|
ClearIssuanceList ();
|
||
|
}
|
||
|
else if ( 0 == GetDlgItemInt (IDC_NUM_SIG_REQUIRED_EDIT) )
|
||
|
SetDlgItemInt (IDC_NUM_SIG_REQUIRED_EDIT, 1);
|
||
|
|
||
|
if ( GetDlgItemInt (IDC_NUM_SIG_REQUIRED_EDIT) > 0 )
|
||
|
{
|
||
|
m_policyTypeCombo.SetCurSel (0);
|
||
|
m_applicationPolicyCombo.SetCurSel (0);
|
||
|
LPSTR pszOID = (LPSTR) m_applicationPolicyCombo.GetItemDataPtr (0);
|
||
|
if ( pszOID )
|
||
|
{
|
||
|
HRESULT hr = m_rCertTemplate.ModifyRAApplicationPolicyList (pszOID, true);
|
||
|
_ASSERT (SUCCEEDED (hr));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
EnableControls ();
|
||
|
|
||
|
bProcessingOnNumSigRequiredCheck = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CTemplateV2AuthenticationPropertyPage::EnablePolicyControls (BOOL& bEnable)
|
||
|
{
|
||
|
GetDlgItem (IDC_NUM_SIG_REQUIRED_EDIT)->EnableWindow (bEnable);
|
||
|
|
||
|
if ( bEnable )
|
||
|
{
|
||
|
if ( GetDlgItemInt (IDC_NUM_SIG_REQUIRED_EDIT) < 1 )
|
||
|
bEnable = false;
|
||
|
}
|
||
|
|
||
|
GetDlgItem (IDC_POLICY_TYPES_LABEL)->EnableWindow (bEnable);
|
||
|
GetDlgItem (IDC_POLICY_TYPES)->EnableWindow (bEnable);
|
||
|
GetDlgItem (IDC_APP_POLICY_LABEL)->EnableWindow (bEnable);
|
||
|
GetDlgItem (IDC_APPLICATION_POLICIES)->EnableWindow (bEnable);
|
||
|
GetDlgItem (IDC_ISSUANCE_POLICY_LABEL)->EnableWindow (bEnable);
|
||
|
GetDlgItem (IDC_ISSUANCE_POLICIES)->EnableWindow (bEnable);
|
||
|
GetDlgItem (IDC_ADD_APPROVAL)->EnableWindow (bEnable);
|
||
|
GetDlgItem (IDC_REMOVE_APPROVAL)->EnableWindow (bEnable);
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL CTemplateV2AuthenticationPropertyPage::OnKillActive()
|
||
|
{
|
||
|
switch (m_policyTypeCombo.GetItemData (m_policyTypeCombo.GetCurSel ()))
|
||
|
{
|
||
|
case POLICY_TYPE_ISSUANCE:
|
||
|
{
|
||
|
// Inform the user that
|
||
|
// an issuance policy must be added if there aren't any
|
||
|
m_rCertTemplate.IssuancePoliciesRequired (
|
||
|
(0 == m_issuanceList.GetCount ()) ? true : false);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case POLICY_TYPE_APPLICATION:
|
||
|
m_rCertTemplate.IssuancePoliciesRequired (false);
|
||
|
break;
|
||
|
|
||
|
case POLICY_TYPE_APPLICATION_AND_ISSUANCE:
|
||
|
{
|
||
|
// Inform the user
|
||
|
// that an issuance policy must be added, if there aren't any.
|
||
|
m_rCertTemplate.IssuancePoliciesRequired (
|
||
|
(0 == m_issuanceList.GetCount ()) ? true : false);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
default: // nothing selected
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return CHelpPropertyPage::OnKillActive();
|
||
|
}
|
||
|
|
||
|
void CTemplateV2AuthenticationPropertyPage::OnReenrollmentSameAsEnrollment()
|
||
|
{
|
||
|
HRESULT hr = m_rCertTemplate.SetReenrollmentValidWithPreviousApproval (
|
||
|
BST_CHECKED == SendDlgItemMessage (IDC_REENROLLMENT_REQUIRES_VALID_CERT, BM_GETCHECK));
|
||
|
if ( SUCCEEDED (hr) )
|
||
|
{
|
||
|
SetModified ();
|
||
|
m_rbIsDirty = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CTemplateV2AuthenticationPropertyPage::ClearIssuanceList ()
|
||
|
{
|
||
|
int nCnt = m_issuanceList.GetCount ();
|
||
|
for (int nIndex = nCnt-1; nIndex >= 0; nIndex--)
|
||
|
{
|
||
|
LPSTR pszOID = (LPSTR) m_issuanceList.GetItemDataPtr (nIndex);
|
||
|
if ( pszOID )
|
||
|
{
|
||
|
HRESULT hr = m_rCertTemplate.ModifyRAIssuancePolicyList (pszOID, false);
|
||
|
if ( SUCCEEDED (hr) )
|
||
|
{
|
||
|
m_issuanceList.DeleteString (nIndex);
|
||
|
delete [] pszOID;
|
||
|
SetModified ();
|
||
|
m_rbIsDirty = true;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
_ASSERT (0);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|