// CreateKeyDlg.cpp : implementation file // #include "stdafx.h" #include "KeyRing.h" extern "C" { #include #include } #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); }