Leaked source code of windows server 2003
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.
 
 
 
 
 
 

216 lines
6.4 KiB

/////////////////////////////////////////////////////////////////////////////////
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2000-2002.
//
// File: BasicConstraintsDlg.cpp
//
// Contents: Implementation of CBasicConstraintsDlg
//
//----------------------------------------------------------------------------
// BasicConstraintsDlg.cpp : implementation file
//
#include "stdafx.h"
#include "BasicConstraintsDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CBasicConstraintsDlg property page
CBasicConstraintsDlg::CBasicConstraintsDlg(CWnd* pParent,
CCertTemplate& rCertTemplate,
PCERT_EXTENSION pCertExtension)
: CHelpDialog(CBasicConstraintsDlg::IDD, pParent),
m_rCertTemplate (rCertTemplate),
m_pCertExtension (pCertExtension),
m_bModified (false),
m_pBCInfo (0),
m_cbInfo (0)
{
//{{AFX_DATA_INIT(CBasicConstraintsDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_rCertTemplate.AddRef ();
}
CBasicConstraintsDlg::~CBasicConstraintsDlg()
{
if ( m_pBCInfo )
LocalFree (m_pBCInfo);
m_rCertTemplate.Release ();
}
void CBasicConstraintsDlg::DoDataExchange(CDataExchange* pDX)
{
CHelpDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CBasicConstraintsDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CBasicConstraintsDlg, CHelpDialog)
//{{AFX_MSG_MAP(CBasicConstraintsDlg)
ON_WM_CANCELMODE()
ON_BN_CLICKED(IDC_BASIC_CONSTRAINTS_CRITICAL, OnBasicConstraintsCritical)
ON_BN_CLICKED(IDC_ONLY_ISSUE_END_ENTITIES, OnOnlyIssueEndEntities)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBasicConstraintsDlg message handlers
BOOL CBasicConstraintsDlg::OnInitDialog()
{
_TRACE (1, L"Entering CBasicConstraintsDlg::OnInitDialog\n");
CHelpDialog::OnInitDialog();
if ( m_pCertExtension->fCritical )
SendDlgItemMessage (IDC_BASIC_CONSTRAINTS_CRITICAL, BM_SETCHECK, BST_CHECKED);
if ( 1 == m_rCertTemplate.GetType () )
{
GetDlgItem (IDC_BASIC_CONSTRAINTS_CRITICAL)->EnableWindow (FALSE);
GetDlgItem (IDC_ONLY_ISSUE_END_ENTITIES)->EnableWindow (FALSE);
}
if ( CryptDecodeObject (
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
szOID_BASIC_CONSTRAINTS2,
m_pCertExtension->Value.pbData,
m_pCertExtension->Value.cbData,
0,
0,
&m_cbInfo) )
{
m_pBCInfo = (PCERT_BASIC_CONSTRAINTS2_INFO) ::LocalAlloc (
LPTR, m_cbInfo);
if ( m_pBCInfo )
{
if ( CryptDecodeObject (
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
szOID_BASIC_CONSTRAINTS2,
m_pCertExtension->Value.pbData,
m_pCertExtension->Value.cbData,
0,
m_pBCInfo,
&m_cbInfo) )
{
if ( m_pBCInfo->fPathLenConstraint )
SendDlgItemMessage (IDC_ONLY_ISSUE_END_ENTITIES, BM_SETCHECK, BST_CHECKED);
}
else
{
_TRACE (0, L"CryptDecodeObjectEx (szOID_BASIC_CONSTRAINTS2) failed: 0x%x\n", GetLastError ());
}
}
}
else
{
DWORD dwErr = GetLastError ();
CString text;
CString caption;
CThemeContextActivator activator;
VERIFY (caption.LoadString (IDS_CERTTMPL));
// security review 2/21/2002 BryanWal ok
text.FormatMessage (IDS_CANNOT_READ_BASIC_CONSTRAINTS, GetSystemMessage (dwErr));
MessageBox (text, caption, MB_ICONWARNING);
_TRACE (0, L"CryptDecodeObjectEx (szOID_BASIC_CONSTRAINTS2) failed: 0x%x\n", dwErr);
}
EnableControls ();
_TRACE (-1, L"Leaving CBasicConstraintsDlg::OnInitDialog\n");
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CBasicConstraintsDlg::OnBasicConstraintsCritical()
{
m_pCertExtension->fCritical = BST_CHECKED == SendDlgItemMessage (IDC_BASIC_CONSTRAINTS_CRITICAL, BM_GETCHECK);
m_bModified = true;
EnableControls ();
}
void CBasicConstraintsDlg::EnableControls()
{
if ( 1 == m_rCertTemplate.GetType () )
{
GetDlgItem (IDOK)->EnableWindow (FALSE);
GetDlgItem (IDC_BASIC_CONSTRAINTS_CRITICAL)->EnableWindow (FALSE);
GetDlgItem (IDC_ONLY_ISSUE_END_ENTITIES)->EnableWindow (FALSE);
}
else
{
GetDlgItem (IDOK)->EnableWindow (m_bModified && !m_rCertTemplate.ReadOnly ());
GetDlgItem (IDC_BASIC_CONSTRAINTS_CRITICAL)->EnableWindow (!m_rCertTemplate.ReadOnly ());
GetDlgItem (IDC_ONLY_ISSUE_END_ENTITIES)->EnableWindow (!m_rCertTemplate.ReadOnly ());
}
}
void CBasicConstraintsDlg::OnOnlyIssueEndEntities()
{
m_bModified = true;
EnableControls ();
}
void CBasicConstraintsDlg::DoContextHelp (HWND hWndControl)
{
_TRACE(1, L"Entering CBasicConstraintsDlg::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_BASIC_CONSTRAINTS) )
{
_TRACE(0, L"WinHelp () failed: 0x%x\n", GetLastError ());
}
break;
}
_TRACE(-1, L"Leaving CBasicConstraintsDlg::DoContextHelp\n");
}
void CBasicConstraintsDlg::OnOK()
{
if ( m_pBCInfo )
{
if ( BST_CHECKED == SendDlgItemMessage (IDC_ONLY_ISSUE_END_ENTITIES, BM_GETCHECK) )
{
m_pBCInfo->dwPathLenConstraint = 0;
m_pBCInfo->fPathLenConstraint = TRUE;
}
else
{
m_pBCInfo->dwPathLenConstraint = (DWORD) -1;
m_pBCInfo->fPathLenConstraint = FALSE;
}
bool bCritical = BST_CHECKED == SendDlgItemMessage (
IDC_BASIC_CONSTRAINTS_CRITICAL, BM_GETCHECK);
HRESULT hr = m_rCertTemplate.SetBasicConstraints (m_pBCInfo, bCritical);
if ( FAILED (hr) )
return;
}
else
return;
CHelpDialog::OnOK();
}