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.
 
 
 
 
 
 

304 lines
7.0 KiB

#include "stdafx.h"
#include "CertWiz.h"
#include "SSLPortPage.h"
#include "Certificat.h"
#include "certutil.h"
#include "strutil.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define DEFAULT_SSL_PORT _T("443")
/////////////////////////////////////////////////////////////////////////////
// CSSLPortPage property page
void AFXAPI
DDXV_UINT(
IN CDataExchange * pDX,
IN UINT nID,
IN OUT UINT & uValue,
IN UINT uMin,
IN UINT uMax,
IN UINT nEmptyErrorMsg OPTIONAL
)
/*++
Routine Description:
DDX/DDV Function that uses a space to denote a 0 value
Arguments:
CDataExchange * pDX : Data exchange object
UINT nID : Resource ID
OUT UINT & uValue : Value
UINT uMin : Minimum value
UINT uMax : Maximum value
UINT nEmptyErrorMsg : Error message ID for empty unit, or 0 if empty OK
Return Value:
None.
--*/
{
ASSERT(uMin <= uMax);
CWnd * pWnd = CWnd::FromHandle(pDX->PrepareEditCtrl(nID));
ASSERT(pWnd != NULL);
if (pDX->m_bSaveAndValidate)
{
if (pWnd->GetWindowTextLength() > 0)
{
// this needs to come before DDX_TextBalloon
DDV_MinMaxBalloon(pDX, nID, uMin, uMax);
DDX_TextBalloon(pDX, nID, uValue);
}
else
{
uValue = 0;
if (nEmptyErrorMsg)
{
DDV_ShowBalloonAndFail(pDX, nEmptyErrorMsg);
}
}
}
else
{
if (uValue != 0)
{
DDX_TextBalloon(pDX, nID, uValue);
}
else
{
pWnd->SetWindowText(_T(""));
}
}
}
IMPLEMENT_DYNCREATE(CSSLPortPage, CIISWizardPage)
CSSLPortPage::CSSLPortPage(CCertificate * pCert)
: CIISWizardPage(CSSLPortPage::IDD, IDS_CERTWIZ, TRUE),
m_pCert(pCert)
{
//{{AFX_DATA_INIT(CSSLPortPage)
m_SSLPort = _T("");
//}}AFX_DATA_INIT
IDD_PAGE_PREV = IDD_PAGE_WIZ_CHOOSE_CERT;
IDD_PAGE_NEXT = IDD_PAGE_WIZ_INSTALL_CERT;
}
CSSLPortPage::~CSSLPortPage()
{
}
BOOL CSSLPortPage::OnInitDialog()
{
CIISWizardPage::OnInitDialog();
// If m_SSLPort is empty, then look it up from the metabase...
if (m_SSLPort.IsEmpty())
{
HRESULT hr = 0;
if (m_pCert)
{
GetSSLPortFromSite(m_pCert->m_MachineName,m_pCert->m_WebSiteInstanceName,m_pCert->m_SSLPort,&hr);
}
}
return FALSE;
}
void CSSLPortPage::DoDataExchange(CDataExchange* pDX)
{
CIISWizardPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSSLPortPage)
DDX_Text(pDX, IDC_SSL_PORT, m_SSLPort);
DDV_MaxChars(pDX, m_SSLPort, 32);
UINT nSSLPort = StrToInt(m_SSLPort);
DDXV_UINT(pDX, IDC_SSL_PORT, nSSLPort, 1, 65535, IDS_NO_PORT);
//}}AFX_DATA_MAP
}
LRESULT
CSSLPortPage::OnWizardBack()
/*++
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 IDD_PAGE_PREV;
}
LRESULT
CSSLPortPage::OnWizardNext()
/*++
Routine Description:
Next button handler
Arguments:
None
Return Value:
0 to automatically advance to the next page;
1 to prevent the page from changing.
To jump to a page other than the next one,
return the identifier of the dialog to be displayed.
--*/
{
LRESULT lres = 1;
UpdateData(TRUE);
if (m_pCert)
{
m_pCert->m_SSLPort = m_SSLPort;
}
CString buf;
buf.LoadString(IDS_NO_PORT);
if (!IsValidPort((LPCTSTR) m_SSLPort))
{
GetDlgItem(IDC_SSL_PORT)->SetFocus();
AfxMessageBox(buf, MB_OK);
}
else
{
// Check for if it's already being used on other port!
HRESULT hr;
if (TRUE == IsSSLPortBeingUsedOnNonSSLPort(m_pCert->m_MachineName,m_pCert->m_WebSiteInstanceName,m_SSLPort,&hr))
{
GetDlgItem(IDC_SSL_PORT)->SetFocus();
buf.LoadString(IDS_PORT_ALREADY_USED);
AfxMessageBox(buf, MB_OK);
}
else
{
lres = IDD_PAGE_NEXT;
}
}
return lres;
}
BOOL
CSSLPortPage::OnSetActive()
/*++
Routine Description:
Activation handler
We could have empty name field on entrance, so we should
disable Back button
Arguments:
None
Return Value:
TRUE for success, FALSE for failure
--*/
{
ASSERT(m_pCert != NULL);
if (m_pCert)
{
m_SSLPort = m_pCert->m_SSLPort;
switch (m_pCert->GetStatusCode())
{
case CCertificate::REQUEST_INSTALL_CERT:
// this is valid...
IDD_PAGE_PREV = IDD_PAGE_WIZ_CHOOSE_CERT;
IDD_PAGE_NEXT = IDD_PAGE_WIZ_INSTALL_CERT;
break;
case CCertificate::REQUEST_NEW_CERT:
// this is also valid....
//if (m_pCert->m_CAType == CCertificate::CA_ONLINE)
{
IDD_PAGE_PREV = IDD_PAGE_WIZ_GEO_INFO;
IDD_PAGE_NEXT = IDD_PAGE_WIZ_CHOOSE_ONLINE;
}
break;
case CCertificate::REQUEST_PROCESS_PENDING:
// this is valid too...
IDD_PAGE_PREV = IDD_PAGE_WIZ_GETRESP_FILE;
IDD_PAGE_NEXT = IDD_PAGE_WIZ_INSTALL_RESP;
break;
case CCertificate::REQUEST_IMPORT_KEYRING:
// this is valid too...
IDD_PAGE_PREV = IDD_PAGE_WIZ_GET_PASSWORD;
IDD_PAGE_NEXT = IDD_PAGE_WIZ_INSTALL_KEYCERT;
break;
case CCertificate::REQUEST_IMPORT_CERT:
// this is valid too...
IDD_PAGE_PREV = IDD_PAGE_WIZ_GET_IMPORT_PFX_PASSWORD;
IDD_PAGE_NEXT = IDD_PAGE_WIZ_INSTALL_IMPORT_PFX;
break;
// none of these have been implemented to show ssl port
case CCertificate::REQUEST_RENEW_CERT:
case CCertificate::REQUEST_REPLACE_CERT:
case CCertificate::REQUEST_EXPORT_CERT:
case CCertificate::REQUEST_COPY_MOVE_FROM_REMOTE:
case CCertificate::REQUEST_COPY_MOVE_TO_REMOTE:
default:
IDD_PAGE_PREV = IDD_PAGE_WIZ_CHOOSE_CERT;
IDD_PAGE_NEXT = IDD_PAGE_WIZ_INSTALL_CERT;
break;
}
}
if (m_SSLPort.IsEmpty())
{
m_SSLPort = DEFAULT_SSL_PORT;
}
UpdateData(FALSE);
SetWizardButtons(m_SSLPort.IsEmpty() ?
PSWIZB_BACK : PSWIZB_BACK | PSWIZB_NEXT);
return CIISWizardPage::OnSetActive();
}
BOOL
CSSLPortPage::OnKillActive()
/*++
Routine Description:
Activation handler
We could leave this page only if we have good names
entered or when Back button is clicked. In both cases
we should enable both buttons
Arguments:
None
Return Value:
TRUE for success, FALSE for failure
--*/
{
SetWizardButtons(PSWIZB_BACK | PSWIZB_NEXT);
return CIISWizardPage::OnSetActive();
}
BEGIN_MESSAGE_MAP(CSSLPortPage, CIISWizardPage)
//{{AFX_MSG_MAP(CSSLPortPage)
ON_EN_CHANGE(IDC_SSL_PORT, OnEditChangeSSLPort)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSSLPortPage message handlers
void CSSLPortPage::OnEditChangeSSLPort()
{
UpdateData(TRUE);
SetWizardButtons(m_SSLPort.IsEmpty() ?
PSWIZB_BACK : PSWIZB_BACK | PSWIZB_NEXT);
}