|
|
// CreateKeyDlg.cpp : implementation file
//
#include "stdafx.h"
#include "KeyRing.h"
extern "C" { #include <wincrypt.h>
#include <sslsp.h>
}
#include "NwKeyDlg.h"
#include "PassDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
/////////////////////////////////////////////////////////////////////////////
// CCreateKeyDlg dialog
CCreateKeyDlg::CCreateKeyDlg(CWnd* pParent /*=NULL*/) : CDialog(CCreateKeyDlg::IDD, pParent) { //{{AFX_DATA_INIT(CCreateKeyDlg)
m_szNetAddress = _T(""); m_szCountry = _T(""); m_szLocality = _T(""); m_szOrganization = _T(""); m_szUnit = _T(""); m_szState = _T(""); m_szKeyName = _T(""); m_szCertificateFile = _T(""); m_szPassword = _T(""); //}}AFX_DATA_INIT
}
void CCreateKeyDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CCreateKeyDlg)
DDX_Control(pDX, IDC_NEW_KEY_PASSWORD, m_ceditPassword); DDX_Control(pDX, IDOK, m_btnOK); DDX_Control(pDX, IDC_NEW_KEY_BITS, m_comboBits); DDX_Text(pDX, IDC_NEWKEY_COMMONNAME, m_szNetAddress); DDX_Text(pDX, IDC_NEWKEY_COUNTRY, m_szCountry); DDV_MaxChars(pDX, m_szCountry, 2); DDX_Text(pDX, IDC_NEWKEY_LOCALITY, m_szLocality); DDX_Text(pDX, IDC_NEWKEY_ORG, m_szOrganization); DDX_Text(pDX, IDC_NEWKEY_ORGUNIT, m_szUnit); DDX_Text(pDX, IDC_NEWKEY_STATE, m_szState); DDX_Text(pDX, IDC_NEW_KEY_NAME, m_szKeyName); DDX_Text(pDX, IDC_NEW_KEY_REQUEST_FILE, m_szCertificateFile); DDX_Text(pDX, IDC_NEW_KEY_PASSWORD, m_szPassword); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCreateKeyDlg, CDialog) //{{AFX_MSG_MAP(CCreateKeyDlg)
ON_EN_CHANGE(IDC_NEW_KEY_NAME, OnChangeNewKeyName) ON_BN_CLICKED(IDC_NEW_KEY_BROWSE, OnNewKeyBrowse) ON_EN_CHANGE(IDC_NEW_KEY_REQUEST_FILE, OnChangeNewKeyRequestFile) ON_EN_CHANGE(IDC_NEW_KEY_PASSWORD, OnChangeNewKeyPassword) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCreateKeyDlg message handlers
/////////////////////////////////////////////////////////////////////////////
// members
//----------------------------------------------------------------
// override virtual oninitdialog
BOOL CCreateKeyDlg::OnInitDialog( ) { // set the initial strings
m_szKeyName.LoadString( IDS_CREATE_KEY_NEW_NAME ); m_szOrganization.LoadString( IDS_CREATE_KEY_YOUR_COMPANY ); m_szUnit.LoadString( IDS_CREATE_KEY_YOUR_UNIT ); m_szNetAddress.LoadString( IDS_CREATE_KEY_YOUR_ADDRESS ); m_szCountry.LoadString( IDS_LOCALIZED_DEFAULT_COUNTRY_CODE );
m_szState.LoadString( IDS_CREATE_KEY_YOUR_STATE ); m_szLocality.LoadString( IDS_CREATE_KEY_YOUR_LOCALITY );
// call the base oninit
CDialog::OnInitDialog();
// to comply with the munitions export laws, we need to limit the max bits available
m_nMaxBits = 1024; // LOOK HERE KIM
m_nMaxBits = SslGetMaximumKeySize(NULL);
// set the default bit size
m_nBits = m_nMaxBits; m_comboBits.SetCurSel( 2 );
// if necessary, remove items from the bits combo box
if ( m_nMaxBits < 1024 ) { m_comboBits.DeleteString(2); m_comboBits.SetCurSel( 1 ); } if ( m_nMaxBits < 768 ) { m_comboBits.DeleteString(1); m_comboBits.SetCurSel( 0 ); }
// any other defaults
m_fKeyNameChangedFile = FALSE; m_fSpecifiedFile = FALSE; OnChangeNewKeyName();
// we start with no password, so diable the ok window
m_btnOK.EnableWindow( FALSE );
// return 0 to say we set the default item
// return 1 to just select the default default item
return 1; }
//----------------------------------------------------------------
void CCreateKeyDlg::OnChangeNewKeyName() { // if the user has not specifically chosen a file, update the
// path of the request file to reflect the new file name
if ( !m_fSpecifiedFile ) { UpdateData( TRUE ); m_szCertificateFile = _T("C:\\"); m_szCertificateFile += m_szKeyName; m_szCertificateFile += _T(".req"); UpdateData( FALSE ); } }
//----------------------------------------------------------------
void CCreateKeyDlg::OnChangeNewKeyRequestFile() { if ( m_fKeyNameChangedFile ) { // the change is because of a key name change. No big deal.
// reset the flag and return
m_fKeyNameChangedFile = FALSE; return; }
// the user has been typing in the file box, or chose something in
// the dialog. Either way, set the m_fSpecifiedFile flag so that
// we stop changing the path with the key name is changed
m_fSpecifiedFile = TRUE; }
//----------------------------------------------------------------
void CCreateKeyDlg::OnNewKeyBrowse() { CFileDialog cfdlg(FALSE, _T("*.req"), m_szCertificateFile); CString szFilter; WORD i = 0; LPSTR lpszBuffer; // prepare the filter string
szFilter.LoadString( IDS_CERTIFICATE_FILTER ); // replace the "!" characters with nulls
lpszBuffer = szFilter.GetBuffer(MAX_PATH+1); while( lpszBuffer[i] ) { if ( lpszBuffer[i] == _T('!') ) lpszBuffer[i] = _T('\0'); // yes, set \0 on purpose
i++; }
// prep the dialog
cfdlg.m_ofn.lpstrFilter = lpszBuffer;
// run the dialog
if ( cfdlg.DoModal() == IDOK ) { // get the current data out of the dialog
UpdateData( TRUE );
// get the path for the file from the dialog
m_szCertificateFile = cfdlg.GetPathName(); UpdateData( FALSE );
// the user has been typing in the file box, or chose something in
// the dialog. Either way, set the m_fSpecifiedFile flag so that
// we stop changing the path with the key name is changed
m_fSpecifiedFile = TRUE; }
// release the buffer in the filter string
szFilter.ReleaseBuffer(60); }
//----------------------------------------------------------------
void CCreateKeyDlg::OnOK() { HANDLE hFile;
// get the data out of the dialog
UpdateData( TRUE );
// if the file already exists, ask the user if they want to overwrite it
// also, make sure that it is a valid pathname
hFile = CreateFile( m_szCertificateFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); // if we opened the file, we have an error
if ( hFile != INVALID_HANDLE_VALUE ) { // well, first we close the handle, we were only checking if the file was there after all
CloseHandle( hFile );
// ask the user if they really want to overwrite the file
try { // get the second part of the message from the resources
CString szMessageNote; szMessageNote.LoadString( IDS_CERT_FILE_EXISTS );
// next, build the string we will use in the message box
CString szMessage; szMessage = m_szCertificateFile; szMessage += szMessageNote;
// put up the message box, if the user choose no, they do not want to overwrite the
// file. Then we should exit now
if ( AfxMessageBox(szMessage, MB_ICONQUESTION|MB_YESNO) == IDNO ) return; } catch( CException e ) { return; } }
// first, we need to confirm that the password is alright
// the user must re-enter the password to confirm it
CConfirmPassDlg dlgconfirm; if ( dlgconfirm.DoModal() != IDOK ) return; // confirm the password
if ( dlgconfirm.m_szPassword != m_szPassword ) { AfxMessageBox( IDS_INCORRECT_PASSWORD ); return; }
// set the default bit size
switch( m_comboBits.GetCurSel() ) { case 0: // bits == 512
m_nBits = 512; break; case 1: // bits == 768
m_nBits = 768; break; case 2: // bits == 1024
m_nBits = 1024; break; }; // call the inherited OnOK
CDialog::OnOK(); }
//----------------------------------------------------------------
void CCreateKeyDlg::OnChangeNewKeyPassword() { // if there is no password, disable the ok button.
// otherwise, enable it
UpdateData( TRUE ); m_btnOK.EnableWindow( !m_szPassword.IsEmpty() ); }
//----------------------------------------------------------------
BOOL CCreateKeyDlg::PreTranslateMessage(MSG* pMsg) { // filter commas out of all edit fields except the password field.
// commas would interfere with the distinguishing name information
if ( (pMsg->message == WM_CHAR) && (pMsg->hwnd != m_ceditPassword) && ((TCHAR)pMsg->wParam == _T(',')) ) { MessageBeep(0); return TRUE; }
// translate normally
return CDialog::PreTranslateMessage(pMsg); }
|