638 lines
12 KiB
C++
638 lines
12 KiB
C++
/*++
|
|
|
|
Copyright (c) 1994-2001 Microsoft Corporation
|
|
|
|
Module Name :
|
|
connects.cpp
|
|
|
|
Abstract:
|
|
"Connect to a single server" dialog
|
|
|
|
Author:
|
|
Ronald Meijer (ronaldm)
|
|
Sergei Antonoc (sergeia)
|
|
|
|
Project:
|
|
Internet Services Manager
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
#include "stdafx.h"
|
|
#include "common.h"
|
|
#include "inetprop.h"
|
|
#include "InetMgrApp.h"
|
|
#include "iisobj.h"
|
|
#include "connects.h"
|
|
#include "objpick.h"
|
|
|
|
|
|
|
|
#define MAX_SERVERNAME_LEN (255)
|
|
|
|
const LPCTSTR g_cszInetSTPBasePath_ = _T("Software\\Microsoft\\InetStp");
|
|
const LPCTSTR g_cszMajorVersion_ = _T("MajorVersion");
|
|
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
|
|
extern CInetmgrApp theApp;
|
|
|
|
//
|
|
// CLoginDlg Dialog
|
|
//
|
|
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
|
|
|
|
|
|
|
CLoginDlg::CLoginDlg(
|
|
IN int nType,
|
|
IN CIISMachine * pMachine,
|
|
IN CWnd * pParent OPTIONAL
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Constructor
|
|
|
|
Arguments:
|
|
|
|
int nType : Type of dialog to bring up:
|
|
|
|
LDLG_ACCESS_DENIED - Access Denied dlg
|
|
LDLG_ENTER_PASS - Enter password dlg
|
|
LDLG_IMPERSONATION - Impersonation dlg
|
|
|
|
CIISMachine * pMachine : Machine object
|
|
CWnd * pParent : Parent window
|
|
|
|
Return Value:
|
|
|
|
--*/
|
|
: CDialog(CLoginDlg::IDD, pParent),
|
|
m_nType(nType),
|
|
m_strOriginalUserName(),
|
|
m_strUserName(),
|
|
m_strPassword(),
|
|
m_pMachine(pMachine)
|
|
{
|
|
#if 0 // Keep Classwizard happy
|
|
|
|
//{{AFX_DATA_INIT(CLoginDlg)
|
|
m_strPassword = _T("");
|
|
m_strUserName = _T("");
|
|
//}}AFX_DATA_INIT
|
|
|
|
#endif // 0
|
|
|
|
ASSERT_PTR(m_pMachine);
|
|
}
|
|
|
|
|
|
|
|
void
|
|
CLoginDlg::DoDataExchange(
|
|
IN OUT CDataExchange * pDX
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initialise/Store control data
|
|
|
|
Arguments:
|
|
|
|
CDataExchange * pDX - DDX/DDV control structure
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
|
|
//{{AFX_DATA_MAP(CLoginDlg)
|
|
DDX_Text(pDX, IDC_EDIT_USER_NAME, m_strUserName);
|
|
DDX_Text(pDX, IDC_EDIT_PASSWORD2, m_strPassword);
|
|
DDV_MaxChars(pDX, m_strPassword, PWLEN);
|
|
DDX_Control(pDX, IDC_EDIT_USER_NAME, m_edit_UserName);
|
|
DDX_Control(pDX, IDC_EDIT_PASSWORD2, m_edit_Password);
|
|
DDX_Control(pDX, IDC_STATIC_PROMPT2, m_static_Prompt);
|
|
DDX_Control(pDX, IDOK, m_button_Ok);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Message Map
|
|
//
|
|
BEGIN_MESSAGE_MAP(CLoginDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CLoginDlg)
|
|
//}}AFX_MSG_MAP
|
|
|
|
ON_EN_CHANGE(IDC_EDIT_USER_NAME, SetControlStates)
|
|
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
|
|
//
|
|
// Message Handlers
|
|
//
|
|
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
|
|
|
|
|
|
|
void
|
|
CLoginDlg::SetControlStates()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Set UI control enabled/disabled states
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
m_button_Ok.EnableWindow(m_edit_UserName.GetWindowTextLength() > 0);
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
CLoginDlg::OnInitDialog()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
WM_INITDIALOG handler. Initialize the dialog.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
TRUE if no focus is to be set automatically, FALSE if the focus
|
|
is already set.
|
|
|
|
--*/
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
CString str;
|
|
|
|
switch(m_nType)
|
|
{
|
|
case LDLG_ENTER_PASS:
|
|
//
|
|
// Change text for the "Enter Password" dialog
|
|
//
|
|
VERIFY(str.LoadString(IDS_ENTER_PASSWORD));
|
|
SetWindowText(str);
|
|
|
|
str.Format(IDS_RESOLVE_PASSWORD, m_pMachine->QueryServerName());
|
|
m_static_Prompt.SetWindowText(str);
|
|
|
|
//
|
|
// Fall through
|
|
//
|
|
|
|
case LDLG_ACCESS_DENIED:
|
|
//
|
|
// This is the default text on the dialog
|
|
//
|
|
m_strUserName = m_strOriginalUserName = m_pMachine->QueryUserName();
|
|
|
|
if (!m_strUserName.IsEmpty())
|
|
{
|
|
m_edit_UserName.SetWindowText(m_strUserName);
|
|
m_edit_Password.SetFocus();
|
|
}
|
|
else
|
|
{
|
|
m_edit_UserName.SetFocus();
|
|
}
|
|
break;
|
|
|
|
case LDLG_IMPERSONATION:
|
|
VERIFY(str.LoadString(IDS_IMPERSONATION));
|
|
SetWindowText(str);
|
|
|
|
str.Format(IDS_IMPERSONATION_PROMPT, m_pMachine->QueryServerName());
|
|
m_static_Prompt.SetWindowText(str);
|
|
m_edit_UserName.SetFocus();
|
|
break;
|
|
|
|
default:
|
|
ASSERT_MSG("Invalid dialog type");
|
|
}
|
|
|
|
SetControlStates();
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
void
|
|
CLoginDlg::OnOK()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
OK button handler. Attempt to connect to the machine specified. If
|
|
machiname is ok, dismiss the dialog. Otherwise put up an error message
|
|
and stay active.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
ASSERT_PTR(m_pMachine);
|
|
|
|
if (UpdateData(TRUE))
|
|
{
|
|
CError err(m_pMachine->Impersonate(m_strUserName, m_strPassword));
|
|
|
|
if (err.Failed())
|
|
{
|
|
//
|
|
// Not a proper impersonation created. Keep the dialog
|
|
// open to make corrections.
|
|
//
|
|
m_pMachine->DisplayError(err);
|
|
|
|
m_edit_Password.SetSel(0, -1);
|
|
m_edit_Password.SetFocus();
|
|
return;
|
|
}
|
|
}
|
|
|
|
EndDialog(IDOK);
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Connect to server dialog
|
|
//
|
|
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
|
|
|
|
|
|
|
ConnectServerDlg::ConnectServerDlg(
|
|
IN CWnd * pParent OPTIONAL
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Constructor.
|
|
|
|
Arguments:
|
|
|
|
CWnd * pParent : Optional pointer to parent window
|
|
|
|
Return Value:
|
|
|
|
N/A
|
|
|
|
--*/
|
|
: CDialog(ConnectServerDlg::IDD, pParent),
|
|
m_fImpersonate(FALSE),
|
|
m_strServerName(),
|
|
m_strPassword(),
|
|
m_strUserName(),
|
|
m_pMachine(NULL)
|
|
{
|
|
#if 0 // Keep Classwizard happy
|
|
|
|
//{{AFX_DATA_INIT(ConnectServerDlg)
|
|
m_fImpersonate = FALSE;
|
|
m_strServerName = _T("");
|
|
m_strUserName = _T("");
|
|
m_strPassword = _T("");
|
|
//}}AFX_DATA_INIT
|
|
|
|
#endif // 0
|
|
}
|
|
|
|
|
|
|
|
void
|
|
ConnectServerDlg::DoDataExchange(
|
|
IN CDataExchange * pDX
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initialise/Store control data
|
|
|
|
Arguments:
|
|
|
|
CDataExchange * pDX - DDX/DDV control structure
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
|
|
//{{AFX_DATA_MAP(ConnectServerDlg)
|
|
DDX_Check(pDX, IDC_CHECK_CONNECT_AS, m_fImpersonate);
|
|
DDX_Text(pDX, IDC_SERVERNAME, m_strServerName);
|
|
DDV_MaxChars(pDX, m_strServerName, MAX_SERVERNAME_LEN);
|
|
DDX_Text(pDX, IDC_EDIT_USER_NAME, m_strUserName);
|
|
DDX_Text(pDX, IDC_EDIT_PASSWORD2, m_strPassword);
|
|
DDV_MaxChars(pDX, m_strPassword, PWLEN);
|
|
DDX_Control(pDX, IDC_EDIT_USER_NAME, m_edit_UserName);
|
|
DDX_Control(pDX, IDC_EDIT_PASSWORD2, m_edit_Password);
|
|
DDX_Control(pDX, IDC_SERVERNAME, m_edit_ServerName);
|
|
DDX_Control(pDX, IDC_STATIC_USER_NAME, m_static_UserName);
|
|
DDX_Control(pDX, IDC_STATIC_PASSWORD2, m_static_Password);
|
|
DDX_Control(pDX, IDOK, m_button_Ok);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Message Map
|
|
//
|
|
BEGIN_MESSAGE_MAP(ConnectServerDlg, CDialog)
|
|
//{{AFX_MSG_MAP(ConnectServerDlg)
|
|
ON_BN_CLICKED(IDC_CHECK_CONNECT_AS, OnCheckConnectAs)
|
|
ON_BN_CLICKED(IDC_BUTTON_BROWSE, OnButtonBrowse)
|
|
ON_BN_CLICKED(ID_HELP, OnButtonHelp)
|
|
//}}AFX_MSG_MAP
|
|
|
|
ON_EN_CHANGE(IDC_SERVERNAME, SetControlStates)
|
|
ON_EN_CHANGE(IDC_EDIT_USER_NAME, SetControlStates)
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
|
|
void
|
|
ConnectServerDlg::SetControlStates()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Set UI control enabled/disabled states.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
m_static_UserName.EnableWindow(m_fImpersonate);
|
|
m_static_Password.EnableWindow(m_fImpersonate);
|
|
m_edit_UserName.EnableWindow(m_fImpersonate);
|
|
m_edit_Password.EnableWindow(m_fImpersonate);
|
|
|
|
m_button_Ok.EnableWindow(
|
|
m_edit_ServerName.GetWindowTextLength() > 0 &&
|
|
(m_edit_UserName.GetWindowTextLength() > 0 || !m_fImpersonate)
|
|
);
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Message Handlers
|
|
//
|
|
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
|
|
|
|
|
|
|
BOOL
|
|
ConnectServerDlg::OnInitDialog()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
WM_INITDIALOG handler. Initialize the dialog.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
TRUE if no focus is to be set automatically, FALSE if the focus
|
|
is already set.
|
|
|
|
--*/
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
SetControlStates();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
void
|
|
ConnectServerDlg::OnButtonBrowse()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
'Browse' button handler. Browse for a computer name
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
CGetComputer picker;
|
|
if (picker.GetComputer(m_hWnd))
|
|
{
|
|
m_edit_ServerName.SetWindowText(picker.m_strComputerName);
|
|
SetControlStates();
|
|
m_button_Ok.SetFocus();
|
|
}
|
|
#ifdef _DEBUG
|
|
else
|
|
{
|
|
TRACE(_T("ConnectServerDlg::OnButtonBrowse() -> Cannot get computer name from browser\n"));
|
|
}
|
|
#endif
|
|
}
|
|
|
|
|
|
|
|
void
|
|
ConnectServerDlg::OnCheckConnectAs()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
"Connect As" checbox event handler. Enable/Disable username/password
|
|
controls.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
m_fImpersonate = !m_fImpersonate;
|
|
|
|
SetControlStates();
|
|
|
|
if (m_fImpersonate)
|
|
{
|
|
m_edit_UserName.SetFocus();
|
|
m_edit_UserName.SetSel(0, -1);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void
|
|
ConnectServerDlg::OnOK()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
OK button handler. Attempt to connect to the machine specified. If
|
|
machiname is ok, dismiss the dialog. Otherwise put up an error message
|
|
and stay active.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
ASSERT(m_pMachine == NULL);
|
|
|
|
CError err;
|
|
|
|
if (UpdateData(TRUE))
|
|
{
|
|
do
|
|
{
|
|
LPCTSTR lpszUserName = m_fImpersonate ? (LPCTSTR)m_strUserName : NULL;
|
|
LPCTSTR lpszPassword = m_fImpersonate ? (LPCTSTR)m_strPassword : NULL;
|
|
|
|
CString server = m_strServerName;
|
|
if (PathIsUNCServer(m_strServerName))
|
|
{
|
|
server = m_strServerName.Mid(2);
|
|
}
|
|
else
|
|
{
|
|
server = m_strServerName;
|
|
}
|
|
|
|
m_pMachine = new CIISMachine(CComAuthInfo(
|
|
server,
|
|
lpszUserName,
|
|
lpszPassword
|
|
));
|
|
|
|
if (m_pMachine)
|
|
{
|
|
//
|
|
// Verify the machine object is created.
|
|
//
|
|
err = CIISMachine::VerifyMachine(m_pMachine);
|
|
if (err.Failed())
|
|
{
|
|
//
|
|
// Not a proper machine object created. Keep the dialog
|
|
// open to make corrections.
|
|
//
|
|
m_pMachine->DisplayError(err);
|
|
m_edit_ServerName.SetSel(0, -1);
|
|
m_edit_ServerName.SetFocus();
|
|
SAFE_DELETE(m_pMachine);
|
|
}
|
|
else
|
|
{
|
|
// IIS5.1 block for iis6 remote administration
|
|
CRegKey rk;
|
|
rk.Create(HKEY_LOCAL_MACHINE, g_cszInetSTPBasePath_);
|
|
DWORD major;
|
|
if (ERROR_SUCCESS == rk.QueryValue(major, g_cszMajorVersion_))
|
|
{
|
|
if (m_pMachine->QueryMajorVersion() == 6 && major == 5)
|
|
{
|
|
AfxMessageBox(IDS_UPGRADE_TO_IIS6);
|
|
SAFE_DELETE(m_pMachine);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
err = ERROR_NOT_ENOUGH_MEMORY;
|
|
err.MessageBox();
|
|
}
|
|
}
|
|
while(FALSE);
|
|
}
|
|
|
|
//
|
|
// Dismiss the dialog only if a proper machine object was created
|
|
//
|
|
if (m_pMachine)
|
|
{
|
|
EndDialog(IDOK);
|
|
}
|
|
}
|
|
|
|
#define HIDD_CONNECT_SERVER 0x29cd9
|
|
|
|
void
|
|
ConnectServerDlg::OnButtonHelp()
|
|
{
|
|
::WinHelp(m_hWnd, theApp.m_pszHelpFilePath, HELP_CONTEXT, HIDD_CONNECT_SERVER);
|
|
}
|