windows-nt/Source/XPSP1/NT/admin/snapin/filemgmt/sfmcfg.cpp
2020-09-26 16:20:57 +08:00

655 lines
16 KiB
C++

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corp., 1997 **/
/**********************************************************************/
/*
sfmcfg.cpp
Implementation for the configuration property page.
FILE HISTORY:
8/20/97 ericdav Code moved into file managemnet snapin
*/
#include "stdafx.h"
#include "sfmcfg.h"
#include "sfmutil.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//
// CMacFilesConfiguration property page
//
/////////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CMacFilesConfiguration, CPropertyPage)
CMacFilesConfiguration::CMacFilesConfiguration()
: CPropertyPage(CMacFilesConfiguration::IDD),
m_bIsNT5(FALSE)
{
//{{AFX_DATA_INIT(CMacFilesConfiguration)
//}}AFX_DATA_INIT
}
CMacFilesConfiguration::~CMacFilesConfiguration()
{
}
void CMacFilesConfiguration::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMacFilesConfiguration)
DDX_Control(pDX, IDC_COMBO_AUTHENTICATION, m_comboAuthentication);
DDX_Control(pDX, IDC_RADIO_SESSSION_LIMIT, m_radioSessionLimit);
DDX_Control(pDX, IDC_EDIT_LOGON_MESSAGE, m_editLogonMessage);
DDX_Control(pDX, IDC_RADIO_SESSION_UNLIMITED, m_radioSessionUnlimited);
DDX_Control(pDX, IDC_CHECK_SAVE_PASSWORD, m_checkSavePassword);
DDX_Control(pDX, IDC_EDIT_SESSION_LIMIT, m_editSessionLimit);
DDX_Control(pDX, IDC_EDIT_SERVER_NAME, m_editServerName);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMacFilesConfiguration, CPropertyPage)
//{{AFX_MSG_MAP(CMacFilesConfiguration)
ON_BN_CLICKED(IDC_RADIO_SESSION_UNLIMITED, OnRadioSessionUnlimited)
ON_BN_CLICKED(IDC_RADIO_SESSSION_LIMIT, OnRadioSesssionLimit)
ON_BN_CLICKED(IDC_CHECK_SAVE_PASSWORD, OnCheckSavePassword)
ON_EN_CHANGE(IDC_EDIT_LOGON_MESSAGE, OnChangeEditLogonMessage)
ON_EN_CHANGE(IDC_EDIT_SERVER_NAME, OnChangeEditServerName)
ON_EN_CHANGE(IDC_EDIT_SESSION_LIMIT, OnChangeEditSessionLimit)
// ON_EN_KILLFOCUS(IDC_EDIT_SESSION_LIMIT, OnKillfocusEditSessionLimit) bug#158617
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_HELPINFO()
ON_WM_CONTEXTMENU()
ON_CBN_SELCHANGE(IDC_COMBO_AUTHENTICATION, OnSelchangeComboAuthentication)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//
// CMacFilesConfiguration message handlers
//
/////////////////////////////////////////////////////////////////////////////
BOOL CMacFilesConfiguration::OnInitDialog()
{
CPropertyPage::OnInitDialog();
AFX_MANAGE_STATE(AfxGetStaticModuleState());
PAFP_SERVER_INFO pAfpServerInfo;
DWORD err;
CString strTemp;
if ( !g_SfmDLL.LoadFunctionPointers() )
return S_OK;
//
// Setup our controls
//
m_editSessionLimit.LimitText(10);
//
// Get the info from the server
//
err = ((SERVERGETINFOPROC) g_SfmDLL[AFP_SERVER_GET_INFO])(m_pSheet->m_hAfpServer,
(LPBYTE*) &pAfpServerInfo);
if (err != NO_ERROR)
{
::SFMMessageBox(err);
//
// Just to setup the radio buttons
//
SetSessionLimit(AFP_MAXSESSIONS);
return TRUE;
}
err = m_pSheet->IsNT5Machine(m_pSheet->m_strMachine, &m_bIsNT5);
if (err != NO_ERROR)
{
m_bIsNT5 = FALSE; // Assume NT4
}
//
// Since we can't just specify which options we want to set,
// we need to save off the original options and then just
// change the ones we expose through this UI. We don't want
// to disturb the others.
//
m_dwAfpOriginalOptions = pAfpServerInfo->afpsrv_options;
//
// Set the information
//
m_editServerName.SetLimitText(AFP_SERVERNAME_LEN);
m_editServerName.SetWindowText(pAfpServerInfo->afpsrv_name);
m_checkSavePassword.SetCheck(
(INT)(pAfpServerInfo->afpsrv_options &
AFP_SRVROPT_ALLOWSAVEDPASSWORD ));
// fill in the combo box and select the correct item
// combobox is not sorted so this is the order of the items
strTemp.LoadString(IDS_AUTH_MS_ONLY);
m_comboAuthentication.AddString(strTemp);
strTemp.LoadString(IDS_AUTH_APPLE_CLEARTEXT);
m_comboAuthentication.AddString(strTemp);
if (m_bIsNT5)
{
strTemp.LoadString(IDS_AUTH_APPLE_ENCRYPTED);
m_comboAuthentication.AddString(strTemp);
strTemp.LoadString(IDS_AUTH_CLEARTEXT_OR_MS);
m_comboAuthentication.AddString(strTemp);
strTemp.LoadString(IDS_AUTH_ENCRYPTED_OR_MS);
m_comboAuthentication.AddString(strTemp);
}
BOOL bCleartext = pAfpServerInfo->afpsrv_options & AFP_SRVROPT_CLEARTEXTLOGONALLOWED;
// default NT4 value for MS AUM
BOOL bMS = (bCleartext) ? FALSE : TRUE;
if (m_bIsNT5)
{
bMS = pAfpServerInfo->afpsrv_options & AFP_SRVROPT_MICROSOFT_UAM;
}
BOOL bEncrypted = pAfpServerInfo->afpsrv_options & AFP_SRVROPT_NATIVEAPPLEUAM;
if (bEncrypted && bMS)
m_comboAuthentication.SetCurSel(4);
else
if (bCleartext && bMS)
m_comboAuthentication.SetCurSel(3);
else
if (bEncrypted)
m_comboAuthentication.SetCurSel(2);
else
if (bCleartext)
m_comboAuthentication.SetCurSel(1);
else
m_comboAuthentication.SetCurSel(0);
SetSessionLimit(pAfpServerInfo->afpsrv_max_sessions);
//
// Direct the message edit control not to add end-of-line
// character from wordwrapped text lines.
//
m_editLogonMessage.SetLimitText(AFP_MESSAGE_LEN);
m_editLogonMessage.FmtLines(FALSE);
m_editLogonMessage.SetWindowText(pAfpServerInfo->afpsrv_login_msg);
((SFMBUFFERFREEPROC) g_SfmDLL[AFP_BUFFER_FREE])(pAfpServerInfo);
SetModified(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
BOOL CMacFilesConfiguration::OnKillActive()
{
// TODO: Add your specialized code here and/or call the base class
return CPropertyPage::OnKillActive();
}
void CMacFilesConfiguration::OnOK()
{
// TODO: Add your specialized code here and/or call the base class
CPropertyPage::OnOK();
}
BOOL CMacFilesConfiguration::OnSetActive()
{
// TODO: Add your specialized code here and/or call the base class
return CPropertyPage::OnSetActive();
}
void CMacFilesConfiguration::OnRadioSessionUnlimited()
{
SetModified(TRUE);
UpdateRadioButtons(TRUE);
}
void CMacFilesConfiguration::OnRadioSesssionLimit()
{
SetModified(TRUE);
UpdateRadioButtons(FALSE);
}
void
CMacFilesConfiguration::UpdateRadioButtons
(
BOOL bUnlimitedClicked
)
{
if (bUnlimitedClicked)
{
m_radioSessionUnlimited.SetCheck(1);
m_radioSessionLimit.SetCheck(0);
m_editSessionLimit.EnableWindow(FALSE);
}
else
{
m_radioSessionUnlimited.SetCheck(0);
m_radioSessionLimit.SetCheck(1);
m_editSessionLimit.EnableWindow(TRUE);
}
}
void
CMacFilesConfiguration::SetSessionLimit
(
DWORD dwSessionLimit
)
{
if ( dwSessionLimit == AFP_MAXSESSIONS )
{
//
// Set selection to the Unlimited button
//
m_radioSessionUnlimited.SetCheck(1);
dwSessionLimit = 1;
UpdateRadioButtons(TRUE);
}
else
{
//
// Set the sessions button to the value
//
m_radioSessionUnlimited.SetCheck(0);
m_spinSessionLimit.SetPos( dwSessionLimit );
UpdateRadioButtons(FALSE);
}
CString cstrSessionLimit;
cstrSessionLimit.Format(_T("%u"), dwSessionLimit);
m_editSessionLimit.SetWindowText(cstrSessionLimit);
}
DWORD
CMacFilesConfiguration::QuerySessionLimit()
{
if (m_radioSessionUnlimited.GetCheck())
{
return AFP_MAXSESSIONS;
}
else
{
CString strSessionLimit;
m_editSessionLimit.GetWindowText(strSessionLimit);
strSessionLimit.TrimLeft();
strSessionLimit.TrimRight();
//
// Strip off any leading zeros
//
int nCount = 0;
while (strSessionLimit[nCount] == '0')
{
nCount++;
}
if (nCount)
{
//
// Leading zeros, strip off and set the text
//
strSessionLimit = strSessionLimit.Right(strSessionLimit.GetLength() - nCount);
}
__int64 i64SessionLimit = _wtoi64(strSessionLimit);
DWORD dwSessionLimit = AFP_MAXSESSIONS;
if (i64SessionLimit <= AFP_MAXSESSIONS)
dwSessionLimit = (DWORD)i64SessionLimit;
if (dwSessionLimit == 0)
dwSessionLimit = 1;
// Now, dwSessionLimit is in the range [1, AFP_MAXSESSIONS]
CString cstrSessionLimit;
cstrSessionLimit.Format(_T("%u"), dwSessionLimit);
m_editSessionLimit.SetWindowText(cstrSessionLimit);
return dwSessionLimit;
}
}
void CMacFilesConfiguration::OnSelchangeComboAuthentication()
{
SetModified(TRUE);
}
void CMacFilesConfiguration::OnCheckSavePassword()
{
SetModified(TRUE);
}
void CMacFilesConfiguration::OnChangeEditLogonMessage()
{
SetModified(TRUE);
}
void CMacFilesConfiguration::OnChangeEditServerName()
{
SetModified(TRUE);
}
void CMacFilesConfiguration::OnChangeEditSessionLimit()
{
SetModified(TRUE);
}
void CMacFilesConfiguration::OnKillfocusEditSessionLimit()
{
if (::IsWindow(m_editSessionLimit.GetSafeHwnd()))
{
//
// Calling this forces the edit box to validate itself
//
QuerySessionLimit();
}
}
BOOL CMacFilesConfiguration::OnApply()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
AFP_SERVER_INFO AfpServerInfo;
DWORD dwParmNum = 0;
DWORD err;
CString strServerName;
CString strLogonMessage;
if ( !g_SfmDLL.LoadFunctionPointers() )
return S_OK;
::ZeroMemory(&AfpServerInfo, sizeof(AfpServerInfo));
//
// Get the server name
//
if (m_editServerName.GetModify())
{
m_editServerName.GetWindowText(strServerName);
strServerName.TrimLeft();
strServerName.TrimRight();
if ( strServerName.IsEmpty() )
{
::AfxMessageBox(IDS_NEED_SERVER_NAME);
m_editServerName.SetFocus();
return FALSE;
}
//
// Validate the server name
//
if ( strServerName.Find(_T(':') ) != -1 )
{
::AfxMessageBox( IDS_AFPERR_InvalidServerName );
m_editServerName.SetFocus();
m_editServerName.SetSel(0, -1);
return FALSE;
}
//
// Warn the user that the change won't take effect until
// the service is restarted.
//
if (!m_bIsNT5)
{
::AfxMessageBox(IDS_SERVERNAME_CHANGE, MB_ICONEXCLAMATION);
}
AfpServerInfo.afpsrv_name = (LPWSTR) ((LPCWSTR) strServerName);
dwParmNum |= AFP_SERVER_PARMNUM_NAME;
m_editServerName.SetModify(FALSE);
}
//
// Get the logon message
//
if (m_editLogonMessage.GetModify())
{
m_editLogonMessage.GetWindowText(strLogonMessage);
strLogonMessage.TrimLeft();
strLogonMessage.TrimRight();
//
// Was there any text ?
//
if ( strLogonMessage.IsEmpty() ) // always has a terminating NULL
{
AfpServerInfo.afpsrv_login_msg = NULL;
}
else
{
if ( strLogonMessage.GetLength() > AFP_MESSAGE_LEN )
{
::AfxMessageBox(IDS_MESSAGE_TOO_LONG);
// Set focus to the edit box and select the text
m_editLogonMessage.SetFocus();
m_editLogonMessage.SetSel(0, -1);
return(FALSE);
}
AfpServerInfo.afpsrv_login_msg = (LPWSTR) ((LPCWSTR) strLogonMessage);
}
dwParmNum |= AFP_SERVER_PARMNUM_LOGINMSG;
m_editLogonMessage.SetModify(FALSE);
}
//
// Restore the original options and then just update the ones we
// are able to change
//
AfpServerInfo.afpsrv_options = m_dwAfpOriginalOptions;
//
// Set the server options to whatever the user set
//
if (m_checkSavePassword.GetCheck())
{
//
// Set the option bit
//
AfpServerInfo.afpsrv_options |= AFP_SRVROPT_ALLOWSAVEDPASSWORD;
}
else
{
//
// Clear the option bit
//
AfpServerInfo.afpsrv_options &= ~AFP_SRVROPT_ALLOWSAVEDPASSWORD;
}
// set the correct authentication options depending upon what is selected
switch (m_comboAuthentication.GetCurSel())
{
case 0:
// MS Auth only
if (!m_bIsNT5)
{
AfpServerInfo.afpsrv_options &= ~AFP_SRVROPT_MICROSOFT_UAM;
}
else
{
AfpServerInfo.afpsrv_options |= AFP_SRVROPT_MICROSOFT_UAM;
}
AfpServerInfo.afpsrv_options &= ~AFP_SRVROPT_CLEARTEXTLOGONALLOWED;
AfpServerInfo.afpsrv_options &= ~AFP_SRVROPT_NATIVEAPPLEUAM;
break;
case 1:
// Apple cleartext
AfpServerInfo.afpsrv_options |= AFP_SRVROPT_CLEARTEXTLOGONALLOWED;
AfpServerInfo.afpsrv_options &= ~AFP_SRVROPT_MICROSOFT_UAM;
AfpServerInfo.afpsrv_options &= ~AFP_SRVROPT_NATIVEAPPLEUAM;
break;
case 2:
// Apple encrypted (only on NT5)
AfpServerInfo.afpsrv_options &= ~AFP_SRVROPT_CLEARTEXTLOGONALLOWED;
AfpServerInfo.afpsrv_options &= ~AFP_SRVROPT_MICROSOFT_UAM;
AfpServerInfo.afpsrv_options |= AFP_SRVROPT_NATIVEAPPLEUAM;
break;
case 3:
// Cleartext or MS (only on NT5)
AfpServerInfo.afpsrv_options |= AFP_SRVROPT_CLEARTEXTLOGONALLOWED;
AfpServerInfo.afpsrv_options |= AFP_SRVROPT_MICROSOFT_UAM;
AfpServerInfo.afpsrv_options &= ~AFP_SRVROPT_NATIVEAPPLEUAM;
break;
case 4:
// Apple Encrypted or MS (only on NT5)
AfpServerInfo.afpsrv_options &= ~AFP_SRVROPT_CLEARTEXTLOGONALLOWED;
AfpServerInfo.afpsrv_options |= AFP_SRVROPT_MICROSOFT_UAM;
AfpServerInfo.afpsrv_options |= AFP_SRVROPT_NATIVEAPPLEUAM;
break;
default:
ASSERT(FALSE);
break;
}
// if we are enabling an authentication type that has apple encrypted
// then we need to warn the user.
if ( (AfpServerInfo.afpsrv_options & AFP_SRVROPT_NATIVEAPPLEUAM) &&
!(m_dwAfpOriginalOptions & AFP_SRVROPT_NATIVEAPPLEUAM) )
{
if (AfxMessageBox(IDS_AUTH_WARNING, MB_OKCANCEL) == IDCANCEL)
{
m_comboAuthentication.SetFocus();
return FALSE;
}
}
//
// Get the session limit
//
AfpServerInfo.afpsrv_max_sessions = QuerySessionLimit();
//
// Now tell the server about it
//
dwParmNum |= ( AFP_SERVER_PARMNUM_OPTIONS |
AFP_SERVER_PARMNUM_MAX_SESSIONS );
err = ((SERVERSETINFOPROC) g_SfmDLL[AFP_SERVER_SET_INFO])(m_pSheet->m_hAfpServer,
(LPBYTE)&AfpServerInfo,
dwParmNum );
if ( err != NO_ERROR )
{
::SFMMessageBox(err);
return FALSE;
}
// update our options
m_dwAfpOriginalOptions = AfpServerInfo.afpsrv_options;
//
// Clear the modified status for this page
//
SetModified(FALSE);
return TRUE;
}
int CMacFilesConfiguration::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CPropertyPage::OnCreate(lpCreateStruct) == -1)
return -1;
HWND hParent = ::GetParent(m_hWnd);
_ASSERTE(hParent);
if (m_pSheet)
{
m_pSheet->AddRef();
m_pSheet->SetSheetWindow(hParent);
}
return 0;
}
void CMacFilesConfiguration::OnDestroy()
{
CPropertyPage::OnDestroy();
if (m_pSheet)
{
SetEvent(m_pSheet->m_hDestroySync);
m_pSheet->SetSheetWindow(NULL);
m_pSheet->Release();
}
}
BOOL CMacFilesConfiguration::OnHelpInfo(HELPINFO* pHelpInfo)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (pHelpInfo->iContextType == HELPINFO_WINDOW)
{
::WinHelp ((HWND)pHelpInfo->hItemHandle,
m_pSheet->m_strHelpFilePath,
HELP_WM_HELP,
g_aHelpIDs_CONFIGURE_SFM);
}
return TRUE;
}
void CMacFilesConfiguration::OnContextMenu(CWnd* pWnd, CPoint /*point*/)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (this == pWnd)
return;
::WinHelp (pWnd->m_hWnd,
m_pSheet->m_strHelpFilePath,
HELP_CONTEXTMENU,
g_aHelpIDs_CONFIGURE_SFM);
}