windows-nt/Source/XPSP1/NT/admin/snapin/certentp/templatev2subjectnamepropertypage.cpp
2020-09-26 16:20:57 +08:00

436 lines
14 KiB
C++

/////////////////////////////////////////////////////////////////////////////////
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2000-2001.
//
// File: TemplateV2SubjectNamePropertyPage.cpp
//
// Contents: Implementation of CTemplateV2SubjectNamePropertyPage
//
//----------------------------------------------------------------------------
// TemplateV2SubjectNamePropertyPage.cpp : implementation file
//
#include "stdafx.h"
#include "TemplateV2SubjectNamePropertyPage.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTemplateV2SubjectNamePropertyPage property page
CTemplateV2SubjectNamePropertyPage::CTemplateV2SubjectNamePropertyPage(
CCertTemplate& rCertTemplate, bool& rbIsDirty, bool bIsComputerOrDC)
: CHelpPropertyPage(CTemplateV2SubjectNamePropertyPage::IDD),
m_rCertTemplate (rCertTemplate),
m_rbIsDirty (rbIsDirty),
m_bIsComputerOrDC (bIsComputerOrDC)
{
//{{AFX_DATA_INIT(CTemplateV2SubjectNamePropertyPage)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_rCertTemplate.AddRef ();
}
CTemplateV2SubjectNamePropertyPage::~CTemplateV2SubjectNamePropertyPage()
{
m_rCertTemplate.Release ();
}
void CTemplateV2SubjectNamePropertyPage::DoDataExchange(CDataExchange* pDX)
{
CHelpPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTemplateV2SubjectNamePropertyPage)
DDX_Control(pDX, IDC_SUBJECT_NAME_NAME_COMBO, m_nameCombo);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTemplateV2SubjectNamePropertyPage, CHelpPropertyPage)
//{{AFX_MSG_MAP(CTemplateV2SubjectNamePropertyPage)
ON_BN_CLICKED(IDC_SUBJECT_AND_SUBJECT_ALT_NAME, OnSubjectAndSubjectAltName)
ON_CBN_SELCHANGE(IDC_SUBJECT_NAME_NAME_COMBO, OnSelchangeSubjectNameNameCombo)
ON_BN_CLICKED(IDC_SUBJECT_NAME_BUILT_BY_CA, OnSubjectNameBuiltByCa)
ON_BN_CLICKED(IDC_SUBJECT_NAME_SUPPLIED_IN_REQUEST, OnSubjectNameSuppliedInRequest)
ON_BN_CLICKED(IDC_DNS_NAME, OnDnsName)
ON_BN_CLICKED(IDC_EMAIL_IN_ALT, OnEmailInAlt)
ON_BN_CLICKED(IDC_EMAIL_IN_SUB, OnEmailInSub)
ON_BN_CLICKED(IDC_SPN, OnSpn)
ON_BN_CLICKED(IDC_UPN, OnUpn)
ON_WM_KILLFOCUS()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTemplateV2SubjectNamePropertyPage message handlers
void CTemplateV2SubjectNamePropertyPage::OnSubjectAndSubjectAltName()
{
EnableControls ();
}
void CTemplateV2SubjectNamePropertyPage::EnableControls()
{
BOOL bEnable = FALSE;
if ( m_rCertTemplate.ReadOnly () )
{
bEnable = FALSE;
GetDlgItem (IDC_SUBJECT_NAME_SUPPLIED_IN_REQUEST)->EnableWindow (FALSE);
GetDlgItem (IDC_SUBJECT_NAME_BUILT_BY_CA)->EnableWindow (FALSE);
}
else if ( BST_CHECKED == SendDlgItemMessage (IDC_SUBJECT_NAME_BUILT_BY_CA, BM_GETCHECK) )
bEnable = TRUE;
GetDlgItem (IDC_SUBJECT_NAME_NAME_COMBO)->EnableWindow (bEnable);
GetDlgItem (IDC_SUBJECT_NAME_NAME_LABEL)->EnableWindow (bEnable);
GetDlgItem (IDC_EMAIL_IN_ALT)->EnableWindow (bEnable);
GetDlgItem (IDC_DNS_NAME)->EnableWindow (bEnable); // removed for bug 253823 "&& !m_bIsComputerOrDC);"
GetDlgItem (IDC_UPN)->EnableWindow (bEnable);
GetDlgItem (IDC_SPN)->EnableWindow (bEnable);
BOOL bEnableEmailInSub = FALSE;
if ( bEnable )
{
int nSel = m_nameCombo.GetCurSel ();
if ( nSel >= 0 )
{
if ( NAME_TYPE_NONE != m_nameCombo.GetItemData (nSel) )
bEnableEmailInSub = TRUE;
}
}
GetDlgItem (IDC_EMAIL_IN_SUB)->EnableWindow (bEnableEmailInSub);
if ( !bEnableEmailInSub )
SendDlgItemMessage (IDC_EMAIL_IN_SUB, BM_SETCHECK, BST_UNCHECKED);
}
BOOL CTemplateV2SubjectNamePropertyPage::OnInitDialog()
{
CHelpPropertyPage::OnInitDialog ();
// Initialize Combo Box
CString text;
VERIFY (text.LoadString (IDS_SUBJECT_NAME_NONE));
int nIndex = m_nameCombo.AddString (text);
if ( nIndex >= 0 )
{
m_nameCombo.SetCurSel (nIndex); // set by default
m_nameCombo.SetItemData (nIndex, (DWORD_PTR) NAME_TYPE_NONE);
}
VERIFY (text.LoadString (IDS_FULL_DN));
nIndex = m_nameCombo.AddString (text);
if ( nIndex >= 0 )
{
m_nameCombo.SetItemData (nIndex, (DWORD_PTR) NAME_TYPE_FULL_DN);
if ( m_rCertTemplate.SubjectNameMustBeFullDN () )
m_nameCombo.SetCurSel (nIndex);
}
VERIFY (text.LoadString (IDS_CN_ONLY));
nIndex = m_nameCombo.AddString (text);
if ( nIndex >= 0 )
{
m_nameCombo.SetItemData (nIndex, (DWORD_PTR) NAME_TYPE_CN_ONLY);
if ( m_rCertTemplate.SubjectNameMustBeCN () )
m_nameCombo.SetCurSel (nIndex);
}
// Initialize Radio buttons
if ( m_rCertTemplate.RequireSubjectInRequest () )
SendDlgItemMessage (IDC_SUBJECT_NAME_SUPPLIED_IN_REQUEST, BM_SETCHECK, BST_CHECKED);
else
SendDlgItemMessage (IDC_SUBJECT_NAME_BUILT_BY_CA, BM_SETCHECK, BST_CHECKED);
// Initialize Check boxes
if ( m_rCertTemplate.SubjectNameIncludesEMail () )
SendDlgItemMessage (IDC_EMAIL_IN_SUB, BM_SETCHECK, BST_CHECKED);
if ( m_rCertTemplate.AltNameIncludesDNS () )
SendDlgItemMessage (IDC_DNS_NAME, BM_SETCHECK, BST_CHECKED);
if ( m_rCertTemplate.AltNameIncludesEMail () )
SendDlgItemMessage (IDC_EMAIL_IN_ALT, BM_SETCHECK, BST_CHECKED);
if ( m_rCertTemplate.AltNameIncludesUPN () )
SendDlgItemMessage (IDC_UPN, BM_SETCHECK, BST_CHECKED);
if ( m_rCertTemplate.AltNameIncludesSPN () )
SendDlgItemMessage (IDC_SPN, BM_SETCHECK, BST_CHECKED);
EnableControls ();
return TRUE;
}
void CTemplateV2SubjectNamePropertyPage::SetSettingsForNameTypeNone ()
{
m_rCertTemplate.SubjectNameMustBeCN (false);
m_rCertTemplate.SubjectNameMustBeFullDN (false);
int nCntChecked = 0;
if ( BST_CHECKED == SendDlgItemMessage (IDC_EMAIL_IN_ALT, BM_GETCHECK) )
nCntChecked++;
if ( BST_CHECKED == SendDlgItemMessage (IDC_DNS_NAME, BM_GETCHECK) )
nCntChecked++;
if ( BST_CHECKED == SendDlgItemMessage (IDC_UPN, BM_GETCHECK) )
nCntChecked++;
if ( BST_CHECKED == SendDlgItemMessage (IDC_SPN, BM_GETCHECK) )
nCntChecked++;
if ( 0 == nCntChecked )
{
m_rCertTemplate.AltNameIncludesUPN (true);
SendDlgItemMessage (IDC_UPN, BM_SETCHECK, BST_CHECKED);
}
// NTRAID# 313588 CertTMPL: If subject name format = none,
// sub alt name should be marked as critical for D.C.A. cert
// template.
m_rCertTemplate.ModifyCriticalExtensions (szOID_SUBJECT_ALT_NAME, true);
}
void CTemplateV2SubjectNamePropertyPage::OnSelchangeSubjectNameNameCombo()
{
SetModified ();
m_rbIsDirty = true;
int nSel = m_nameCombo.GetCurSel ();
if ( nSel >= 0 )
{
switch (m_nameCombo.GetItemData (nSel) )
{
case NAME_TYPE_NONE:
SetSettingsForNameTypeNone ();
break;
case NAME_TYPE_FULL_DN:
m_rCertTemplate.SubjectNameMustBeCN (false);
m_rCertTemplate.SubjectNameMustBeFullDN (true);
// NTRAID# 313588 CertTMPL: If subject name format = none,
// sub alt name should be marked as critical for D.C.A. cert
// template.
m_rCertTemplate.ModifyCriticalExtensions (szOID_SUBJECT_ALT_NAME,
false);
break;
case NAME_TYPE_CN_ONLY:
m_rCertTemplate.SubjectNameMustBeCN (true);
m_rCertTemplate.SubjectNameMustBeFullDN (false);
// NTRAID# 313588 CertTMPL: If subject name format = none,
// sub alt name should be marked as critical for D.C.A. cert
// template.
m_rCertTemplate.ModifyCriticalExtensions (szOID_SUBJECT_ALT_NAME,
false);
break;
default:
ASSERT (0);
break;
}
}
EnableControls ();
}
void CTemplateV2SubjectNamePropertyPage::OnSubjectNameBuiltByCa()
{
SetModified ();
SendDlgItemMessage (IDC_SUBJECT_NAME_SUPPLIED_IN_REQUEST, BM_SETCHECK, BST_UNCHECKED);
m_rbIsDirty = true;
m_rCertTemplate.RequireSubjectInRequest (false);
EnableControls ();
}
void CTemplateV2SubjectNamePropertyPage::OnSubjectNameSuppliedInRequest()
{
SetModified ();
SendDlgItemMessage (IDC_SUBJECT_NAME_BUILT_BY_CA, BM_SETCHECK, BST_UNCHECKED);
m_rbIsDirty = true;
m_rCertTemplate.RequireSubjectInRequest (true);
// Clear all "built by CA" settings
int nCnt = m_nameCombo.GetCount ();
for (int nIndex = 0; nIndex < nCnt; nIndex++)
{
if ( NAME_TYPE_NONE == m_nameCombo.GetItemData (nIndex) )
{
m_nameCombo.SetCurSel (nIndex);
break;
}
}
SetSettingsForNameTypeNone ();
if ( BST_CHECKED == SendDlgItemMessage (IDC_EMAIL_IN_SUB, BM_GETCHECK) )
{
SendDlgItemMessage (IDC_EMAIL_IN_SUB, BM_SETCHECK, BST_UNCHECKED);
m_rCertTemplate.SubjectNameIncludesEMail (false);
}
if ( BST_CHECKED == SendDlgItemMessage (IDC_EMAIL_IN_ALT, BM_GETCHECK) &&
CanUncheckLastSetting (IDC_EMAIL_IN_ALT) )
{
SendDlgItemMessage (IDC_EMAIL_IN_ALT, BM_SETCHECK, BST_UNCHECKED);
m_rCertTemplate.AltNameIncludesEMail (false);
}
if ( BST_CHECKED == SendDlgItemMessage (IDC_DNS_NAME, BM_GETCHECK) &&
CanUncheckLastSetting (IDC_DNS_NAME) )
{
m_rCertTemplate.AltNameIncludesDNS (false);
SendDlgItemMessage (IDC_DNS_NAME, BM_SETCHECK, BST_UNCHECKED);
}
if ( BST_CHECKED == SendDlgItemMessage (IDC_UPN, BM_GETCHECK) &&
CanUncheckLastSetting (IDC_UPN) )
{
m_rCertTemplate.AltNameIncludesUPN (false);
SendDlgItemMessage (IDC_UPN, BM_SETCHECK, BST_UNCHECKED);
}
if ( BST_CHECKED == SendDlgItemMessage (IDC_SPN, BM_GETCHECK) &&
CanUncheckLastSetting (IDC_SPN) )
{
m_rCertTemplate.AltNameIncludesSPN (false);
SendDlgItemMessage (IDC_SPN, BM_SETCHECK, BST_UNCHECKED);
}
EnableControls ();
}
void CTemplateV2SubjectNamePropertyPage::OnDnsName()
{
if ( CanUncheckLastSetting (IDC_DNS_NAME) )
{
m_rCertTemplate.AltNameIncludesDNS (
BST_CHECKED == SendDlgItemMessage (IDC_DNS_NAME, BM_GETCHECK));
}
SetModified ();
m_rbIsDirty = true;
}
void CTemplateV2SubjectNamePropertyPage::OnEmailInAlt()
{
if ( CanUncheckLastSetting (IDC_EMAIL_IN_ALT) )
{
m_rCertTemplate.AltNameIncludesEMail (
BST_CHECKED == SendDlgItemMessage (IDC_EMAIL_IN_ALT, BM_GETCHECK));
}
SetModified ();
m_rbIsDirty = true;
}
void CTemplateV2SubjectNamePropertyPage::OnEmailInSub()
{
m_rCertTemplate.SubjectNameIncludesEMail (
BST_CHECKED == SendDlgItemMessage (IDC_EMAIL_IN_SUB, BM_GETCHECK));
SetModified ();
m_rbIsDirty = true;
}
void CTemplateV2SubjectNamePropertyPage::OnSpn()
{
if ( CanUncheckLastSetting (IDC_SPN) )
{
m_rCertTemplate.AltNameIncludesSPN (
BST_CHECKED == SendDlgItemMessage (IDC_SPN, BM_GETCHECK));
}
SetModified ();
m_rbIsDirty = true;
}
void CTemplateV2SubjectNamePropertyPage::OnUpn()
{
if ( CanUncheckLastSetting (IDC_UPN) )
{
m_rCertTemplate.AltNameIncludesUPN (
BST_CHECKED == SendDlgItemMessage (IDC_UPN, BM_GETCHECK));
}
SetModified ();
m_rbIsDirty = true;
}
bool CTemplateV2SubjectNamePropertyPage::CanUncheckLastSetting(int ctrlID)
{
bool bResult = true;
// If request is to be built by CA and "none" is selected for subject name,
// ensure that at least one of the alt-name options is checked
// If the control in question is now unchecked, verify that at least
// one other is checked
if ( BST_UNCHECKED == SendDlgItemMessage (ctrlID, BM_GETCHECK) )
{
if ( BST_CHECKED == SendDlgItemMessage (IDC_SUBJECT_NAME_BUILT_BY_CA, BM_GETCHECK) )
{
int nSel = m_nameCombo.GetCurSel ();
if ( nSel >= 0 )
{
if ( NAME_TYPE_NONE == m_nameCombo.GetItemData (nSel) )
{
int nCntChecked = 0;
if ( BST_CHECKED == SendDlgItemMessage (IDC_EMAIL_IN_ALT, BM_GETCHECK) )
nCntChecked++;
if ( BST_CHECKED == SendDlgItemMessage (IDC_DNS_NAME, BM_GETCHECK) )
nCntChecked++;
if ( BST_CHECKED == SendDlgItemMessage (IDC_UPN, BM_GETCHECK) )
nCntChecked++;
if ( BST_CHECKED == SendDlgItemMessage (IDC_SPN, BM_GETCHECK) )
nCntChecked++;
if ( 0 == nCntChecked )
{
CString text;
CString caption;
CThemeContextActivator activator;
VERIFY (caption.LoadString (IDS_CERTTMPL));
VERIFY (text.LoadString (IDS_AT_LEAST_1_NAME_OPTION_MUST_BE_CHECKED));
MessageBox (text, caption, MB_OK);
bResult = false;
SendDlgItemMessage (ctrlID, BM_SETCHECK, BST_CHECKED);
}
}
}
}
}
return bResult;
}
void CTemplateV2SubjectNamePropertyPage::DoContextHelp (HWND hWndControl)
{
_TRACE(1, L"Entering CTemplateV2SubjectNamePropertyPage::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_SUBJECT_NAME) )
{
_TRACE(0, L"WinHelp () failed: 0x%x\n", GetLastError ());
}
break;
}
_TRACE(-1, L"Leaving CTemplateV2SubjectNamePropertyPage::DoContextHelp\n");
}