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