|
|
// SecuritySettingsPage.cpp : implementation file
//
#include "stdafx.h"
#include "CertWiz.h"
#include "SecuritySettingsPage.h"
#include "Certificat.h"
#include "CertUtil.h"
#include "Shlwapi.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
/////////////////////////////////////////////////////////////////////////////
// CSecuritySettingsPage property page
IMPLEMENT_DYNCREATE(CSecuritySettingsPage, CIISWizardPage)
CSecuritySettingsPage::CSecuritySettingsPage(CCertificate * pCert) : CIISWizardPage(CSecuritySettingsPage::IDD, IDS_CERTWIZ, TRUE), m_pCert(pCert) { //{{AFX_DATA_INIT(CSecuritySettingsPage)
m_BitLengthIndex = -1; m_FriendlyName = _T(""); m_SGC_cert = FALSE; m_choose_CSP = FALSE; //}}AFX_DATA_INIT
m_lru_reg = m_lru_sgc = -1; }
CSecuritySettingsPage::~CSecuritySettingsPage() { }
void CSecuritySettingsPage::DoDataExchange(CDataExchange* pDX) { CIISWizardPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSecuritySettingsPage)
DDX_CBIndex(pDX, IDC_BIT_LENGTH, m_BitLengthIndex); DDX_Text(pDX, IDC_FRIENDLY_NAME, m_FriendlyName); DDV_MaxChars(pDX, m_FriendlyName, 256); DDX_Check(pDX, IDC_SGC_CERT, m_SGC_cert); DDX_Check(pDX, IDC_PROVIDER_SELECT, m_choose_CSP); DDX_Control(pDX, IDC_PROVIDER_SELECT, m_check_csp); //}}AFX_DATA_MAP
}
BOOL CSecuritySettingsPage::OnSetActive() { SetWizardButtons(m_FriendlyName.IsEmpty() ? PSWIZB_BACK : PSWIZB_BACK | PSWIZB_NEXT); return CIISWizardPage::OnSetActive(); }
LRESULT CSecuritySettingsPage::OnWizardPrev() /*++
Routine Description: Prev button handler
Arguments: None
Return Value: 0 to automatically advance to the prev page; 1 to prevent the page from changing. To jump to a page other than the prev one, return the identifier of the dialog to be displayed. --*/ { return CSecuritySettingsPage::IDD_PREV_PAGE; }
LRESULT CSecuritySettingsPage::OnWizardNext() { TCHAR buf[6]; UpdateData(); m_pCert->m_FriendlyName = m_FriendlyName; GetDlgItem(IDC_BIT_LENGTH)->SendMessage(CB_GETLBTEXT, m_BitLengthIndex, (LPARAM)buf); m_pCert->m_KeyLength = StrToInt(buf);
m_pCert->m_SGCcertificat = m_SGC_cert; if (m_SGC_cert) { // it was a smart move, but xenroll makes 512 bits default for SGC,
// so we always creating 512 certs
// if (m_pCert->m_KeyLength == (int)m_sgckey_limits.def)
// m_pCert->m_KeyLength = 0;
} else { if (m_pCert->m_KeyLength == (int)m_regkey_limits.def) { m_pCert->m_KeyLength = 0; } }
VERIFY(m_pCert->SetSecuritySettings()); m_pCert->m_DefaultCSP = !m_choose_CSP; return m_choose_CSP ? IDD_NEXT_CSP : IDD_NEXT_PAGE; }
BEGIN_MESSAGE_MAP(CSecuritySettingsPage, CIISWizardPage) //{{AFX_MSG_MAP(CSecuritySettingsPage)
ON_EN_CHANGE(IDC_FRIENDLY_NAME, OnChangeFriendlyName) ON_BN_CLICKED(IDC_SGC_CERT, OnSgcCert) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSecuritySettingsPage message handlers
DWORD dwPredefinedKeyLength[] = { 0, // 0 means default
512, 1024, 2048, 4096, 8192, 16384 }; #define COUNT_KEYLENGTH sizeof(dwPredefinedKeyLength)/sizeof(dwPredefinedKeyLength[0])
BOOL CSecuritySettingsPage::OnInitDialog() { ASSERT(m_pCert != NULL); m_FriendlyName = m_pCert->m_FriendlyName; CIISWizardPage::OnInitDialog(); OnChangeFriendlyName();
HRESULT hr; CString str; if (GetKeySizeLimits(m_pCert->GetEnrollObject(), &m_regkey_limits.min, &m_regkey_limits.max, &m_regkey_limits.def, FALSE, &hr)) { for (int i = 0, n = 0; i < COUNT_KEYLENGTH; i++) { if ( dwPredefinedKeyLength[i] >= m_regkey_limits.min && dwPredefinedKeyLength[i] <= m_regkey_limits.max ) { m_regkey_size_list.AddTail(dwPredefinedKeyLength[i]); if (m_pCert->GetStatusCode() == CCertificate::REQUEST_NEW_CERT) { if (m_regkey_limits.def == (int)dwPredefinedKeyLength[i]) m_BitLengthIndex = n; } else { if (m_pCert->m_KeyLength == (int)dwPredefinedKeyLength[i]) m_BitLengthIndex = n; } n++; } } } else { ASSERT(FALSE); m_pCert->m_hResult = hr; } if (m_BitLengthIndex == -1) m_BitLengthIndex = 0;
// for SGC temporarily set only one size
m_sgckey_limits.min = 1024; m_sgckey_limits.max = 1024; m_sgckey_limits.def = 1024; m_sgckey_size_list.AddTail(1024); m_SGC_cert = m_pCert->m_SGCcertificat; m_choose_CSP = !m_pCert->m_DefaultCSP; UpdateData(FALSE); SetupKeySizesCombo();
GetDlgItem(IDC_FRIENDLY_NAME)->SetFocus(); return FALSE; }
void CSecuritySettingsPage::OnChangeFriendlyName() { UpdateData(TRUE); SetWizardButtons(m_FriendlyName.IsEmpty() ? PSWIZB_BACK : PSWIZB_BACK | PSWIZB_NEXT); }
void CSecuritySettingsPage::OnSgcCert() { UpdateData(); SetupKeySizesCombo(); }
void CSecuritySettingsPage::SetupKeySizesCombo() { // Currently, only one key size works with SGC flag:
// 1024, so we need to limit combobox to this length, if
// button is checked
CButton * pCheckBox = (CButton *)CWnd::FromHandle(GetDlgItem(IDC_SGC_CERT)->m_hWnd); CComboBox * pCombo = (CComboBox *)CWnd::FromHandle(GetDlgItem(IDC_BIT_LENGTH)->m_hWnd); int check_state = pCheckBox->GetCheck(); int index, count; CList<int, int> * pList; if (m_SGC_cert) { // switch combo to previously selected SGC size
m_lru_reg = pCombo->GetCurSel(); index = m_lru_sgc; pList = &m_sgckey_size_list; } else { // switch combo to previously selected regular size
m_lru_sgc = pCombo->GetCurSel(); index = m_lru_reg; pList = &m_regkey_size_list; } // now refill the combo with key length and select the relevant last one
pCombo->ResetContent(); CString str; POSITION pos = pList->GetHeadPosition(); while (pos != NULL) { str.Format(L"%d", pList->GetNext(pos)); pCombo->AddString(str); } count = pCombo->GetCount(); if (m_SGC_cert) { if (index == CB_ERR) index = 0; } else { if (index == CB_ERR) index = m_BitLengthIndex; } pCombo->SetCurSel(index); pCombo->EnableWindow(count > 1); }
void CSecuritySettingsPage::OnSelectCsp() { m_pCert->m_DefaultCSP = m_check_csp.GetCheck() == 0; m_choose_CSP = !m_pCert->m_DefaultCSP; if (m_pCert->m_DefaultCSP) m_pCert->m_CspName.Empty(); }
|