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
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);
|
|
}
|