////////////////////////////////////////////////////////////////////////////// // // Copyright (c) Microsoft Corp. All rights reserved. // // FILE // // pgauthen.cpp // // SYNOPSIS // // Implementation of CPgAuthentication -- property page to edit // profile attributes related to Authenticaion // ////////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "rrascfg.h" #include "resource.h" #include "PgAuthen.h" #include "helptable.h" #include #include "eapnegotiate.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define NO_OLD_VALUE #define AUTHEN_WARNING_helppath "\\help\\RRASconcepts.chm::/sag_RRAS-Ch1_44.htm" ///////////////////////////////////////////////////////////////////////////// // CPgAuthenticationMerge message handlers BEGIN_MESSAGE_MAP(CPgAuthenticationMerge, CPropertyPage) //{{AFX_MSG_MAP(CPgAuthenticationMerge) ON_BN_CLICKED(IDC_CHECKMD5CHAP, OnCheckmd5chap) ON_BN_CLICKED(IDC_CHECKMSCHAP, OnCheckmschap) ON_BN_CLICKED(IDC_CHECKPAP, OnCheckpap) ON_WM_CONTEXTMENU() ON_WM_HELPINFO() ON_BN_CLICKED(IDC_EAP_METHODS, OnAuthConfigEapMethods) ON_BN_CLICKED(IDC_CHECKMSCHAP2, OnCheckmschap2) ON_BN_CLICKED(IDC_CHECKNOAUTHEN, OnChecknoauthen) ON_BN_CLICKED(IDC_CHECKMSCHAPPASS, OnCheckmschapPass) ON_BN_CLICKED(IDC_CHECKMSCHAP2PASS, OnCheckmschap2Pass) //}}AFX_MSG_MAP END_MESSAGE_MAP() CPgAuthenticationMerge::CPgAuthenticationMerge(CRASProfileMerge& profile) : CManagedPage(CPgAuthenticationMerge::IDD), m_Profile(profile), m_fromProfile(true) { //{{AFX_DATA_INIT(CPgAuthenticationMerge) m_bMD5Chap = FALSE; m_bMSChap = FALSE; m_bPAP = FALSE; m_bMSCHAP2 = FALSE; m_bUNAUTH = FALSE; m_bMSChapPass = FALSE; m_bMSChap2Pass = FALSE; //}}AFX_DATA_INIT m_bEAP = (m_Profile.m_dwArrayAuthenticationTypes.Find(RAS_AT_EAP)!= -1); m_bMSChap = (m_Profile.m_dwArrayAuthenticationTypes.Find(RAS_AT_MSCHAP) != -1); m_bMD5Chap = (m_Profile.m_dwArrayAuthenticationTypes.Find(RAS_AT_MD5CHAP) != -1); m_bPAP = (m_Profile.m_dwArrayAuthenticationTypes.Find(RAS_AT_PAP_SPAP) != -1); m_bMSCHAP2 = (m_Profile.m_dwArrayAuthenticationTypes.Find(RAS_AT_MSCHAP2) != -1); m_bUNAUTH = (m_Profile.m_dwArrayAuthenticationTypes.Find(RAS_AT_UNAUTHEN) != -1); m_bMSChapPass = (m_Profile.m_dwArrayAuthenticationTypes.Find(RAS_AT_MSCHAPPASS) != -1); m_bMSChap2Pass = (m_Profile.m_dwArrayAuthenticationTypes.Find(RAS_AT_MSCHAP2PASS) != -1); // original values before edit m_bOrgEAP = m_bEAP; m_bOrgMD5Chap = m_bMD5Chap; m_bOrgMSChap = m_bMSChap; m_bOrgPAP = m_bPAP; m_bOrgMSCHAP2 = m_bMSCHAP2; m_bOrgUNAUTH = m_bUNAUTH; m_bOrgChapPass = m_bMSChapPass; m_bOrgChap2Pass = m_bMSChap2Pass; m_bAppliedEver = FALSE; SetHelpTable(g_aHelpIDs_IDD_AUTHENTICATION_MERGE); } CPgAuthenticationMerge::~CPgAuthenticationMerge() { // compare the setting with the original ones, // if user turned on more authentication type, // start help if( (!m_bOrgEAP && m_bEAP) || (!m_bOrgMD5Chap && m_bMD5Chap) || (!m_bOrgMSChap && m_bMSChap) || (!m_bOrgChapPass && m_bMSChapPass) || (!m_bOrgPAP && m_bPAP) || (!m_bOrgMSCHAP2 && m_bMSCHAP2) || (!m_bOrgChap2Pass && m_bMSChap2Pass) || (!m_bOrgUNAUTH && m_bUNAUTH)) { if ( IDYES== AfxMessageBox(IDS_WARN_MORE_STEPS_FOR_AUTHEN, MB_YESNO)) HtmlHelpA(NULL, AUTHEN_WARNING_helppath, HH_DISPLAY_TOPIC, 0); } } void CPgAuthenticationMerge::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPgAuthenticationMerge) DDX_Check(pDX, IDC_CHECKMD5CHAP, m_bMD5Chap); DDX_Check(pDX, IDC_CHECKMSCHAP, m_bMSChap); DDX_Check(pDX, IDC_CHECKMSCHAP2, m_bMSCHAP2); DDX_Check(pDX, IDC_CHECKNOAUTHEN, m_bUNAUTH); DDX_Check(pDX, IDC_CHECKPAP, m_bPAP); DDX_Check(pDX, IDC_CHECKMSCHAPPASS, m_bMSChapPass); DDX_Check(pDX, IDC_CHECKMSCHAP2PASS, m_bMSChap2Pass); //}}AFX_DATA_MAP if (!m_bMSChap) { m_bMSChapPass = false; } if (!m_bMSCHAP2) { m_bMSChap2Pass = false; } } BOOL CPgAuthenticationMerge::OnInitDialog() { GetDlgItem(IDC_CHECKMSCHAP2PASS)->EnableWindow(m_bMSCHAP2); GetDlgItem(IDC_CHECKMSCHAPPASS)->EnableWindow(m_bMSChap); try { HRESULT hr = m_Profile.GetEapTypeList( m_eapConfig.types, m_eapConfig.ids, m_eapConfig.typeKeys, &m_eapConfig.infoArray); if FAILED(hr) { ReportError(hr, IDS_ERR_EAPTYPELIST, NULL); } } catch(CMemoryException *pException) { pException->Delete(); AfxMessageBox(IDS_OUTOFMEMORY); return TRUE; } CPropertyPage::OnInitDialog(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CPgAuthenticationMerge::OnCheckmd5chap() { SetModified(); } void CPgAuthenticationMerge::OnCheckmschap() { CButton *Button = reinterpret_cast(GetDlgItem(IDC_CHECKMSCHAP)); int status = Button->GetCheck(); switch (status) { case 1: { GetDlgItem(IDC_CHECKMSCHAPPASS)->EnableWindow(TRUE); break; } case 0: { GetDlgItem(IDC_CHECKMSCHAPPASS)->EnableWindow(FALSE); break; } default: { } } SetModified(); } void CPgAuthenticationMerge::OnCheckmschapPass() { SetModified(); } void CPgAuthenticationMerge::OnCheckmschap2() { CButton *Button = reinterpret_cast(GetDlgItem(IDC_CHECKMSCHAP2)); int status = Button->GetCheck(); switch (status) { case 1: { GetDlgItem(IDC_CHECKMSCHAP2PASS)->EnableWindow(TRUE); break; } case 0: { GetDlgItem(IDC_CHECKMSCHAP2PASS)->EnableWindow(FALSE); break; } default: { } } SetModified(); } void CPgAuthenticationMerge::OnCheckmschap2Pass() { SetModified(); } void CPgAuthenticationMerge::OnCheckpap() { SetModified(); } BOOL CPgAuthenticationMerge::TransferDataToProfile() { // clear the string in profile m_Profile.m_dwArrayAuthenticationTypes.DeleteAll(); if (m_bEAP || m_bMSChap || m_bMD5Chap || m_bPAP || m_bMSCHAP2 || m_bUNAUTH || m_bMSChapPass || m_bMSChap2Pass) { m_Profile.m_dwAttributeFlags |= PABF_msNPAuthenticationType; } else { AfxMessageBox(IDS_DATAENTRY_AUTHENTICATIONTYPE); return FALSE; } // EAP if (m_bEAP) { m_Profile.m_dwArrayAuthenticationTypes.Add(RAS_AT_EAP); } else { m_Profile.m_dwAttributeFlags &= ~PABF_msNPAllowedEapType; m_Profile.m_dwArrayEapTypes.DeleteAll(); m_Profile.m_dwArraynEAPTypeKeys.DeleteAll(); } if (m_eapConfig.typesSelected.GetSize() > 0) { // here the button configure eap.. was pressed and some eap types // were selected. (could be the same as before) m_Profile.m_dwAttributeFlags |= PABF_msNPAllowedEapType; CDWArray eapTypesSelected; CDWArray typeKeysSelected; for (int i = 0; i < m_eapConfig.typesSelected.GetSize(); ++i) { // For each EAP Type Selected (string) // position = index in the types, ids and typekeys arrays // corresponding to the EAP type selected int position = m_eapConfig.types.Find( *m_eapConfig.typesSelected.GetAt(i)); eapTypesSelected.Add(m_eapConfig.ids.GetAt(position)); typeKeysSelected.Add(m_eapConfig.typeKeys.GetAt(position)); } m_Profile.m_dwArrayEapTypes = eapTypesSelected; m_Profile.m_dwArraynEAPTypeKeys = typeKeysSelected; } // else: EAP was enabled when the page was opened. Nothing was changed in // the EAP config. No need to update the list of eap types. // MS-Chap2 if(m_bMSCHAP2) m_Profile.m_dwArrayAuthenticationTypes.Add(IAS_AUTH_MSCHAP2); // MS-Chap if(m_bMSChap) m_Profile.m_dwArrayAuthenticationTypes.Add(IAS_AUTH_MSCHAP); // MS-Chap2 Password Change if(m_bMSChap2Pass) m_Profile.m_dwArrayAuthenticationTypes.Add(IAS_AUTH_MSCHAP2_CPW); // MS-Chap Password Change if(m_bMSChapPass) m_Profile.m_dwArrayAuthenticationTypes.Add(IAS_AUTH_MSCHAP_CPW); // Chap if(m_bMD5Chap) m_Profile.m_dwArrayAuthenticationTypes.Add(IAS_AUTH_MD5CHAP); // PAP if(m_bPAP) { m_Profile.m_dwArrayAuthenticationTypes.Add(IAS_AUTH_PAP); } // UNAUTH if(m_bUNAUTH) { m_Profile.m_dwArrayAuthenticationTypes.Add(IAS_AUTH_NONE); } return TRUE; } void CPgAuthenticationMerge::OnOK() { CManagedPage::OnOK(); } BOOL CPgAuthenticationMerge::OnApply() { if (!GetModified()) { return TRUE; } if (!TransferDataToProfile()) { return FALSE; } m_bAppliedEver = TRUE; return CManagedPage::OnApply(); } void CPgAuthenticationMerge::OnContextMenu(CWnd* pWnd, CPoint point) { CManagedPage::OnContextMenu(pWnd, point); } BOOL CPgAuthenticationMerge::OnHelpInfo(HELPINFO* pHelpInfo) { return CManagedPage::OnHelpInfo(pHelpInfo); } BOOL CPgAuthenticationMerge::OnKillActive() { UpdateData(); if (!TransferDataToProfile()) { return FALSE; } return CPropertyPage::OnKillActive(); } void CPgAuthenticationMerge::OnAuthConfigEapMethods() { EapConfig eapConfigBackup; eapConfigBackup = m_eapConfig; EapNegotiate eapNegotiate(this, m_eapConfig, m_Profile, m_fromProfile); HRESULT hr = eapNegotiate.m_eapProfile.Assign(m_Profile.m_eapConfigData); if (SUCCEEDED(hr)) { if (eapNegotiate.DoModal() == IDOK) { m_Profile.m_eapConfigData.Swap(eapNegotiate.m_eapProfile); m_bEAP = (m_eapConfig.typesSelected.GetSize() > 0)? TRUE: FALSE; SetModified(); m_fromProfile = false; } } else { m_eapConfig = eapConfigBackup; } } void CPgAuthenticationMerge::OnChecknoauthen() { SetModified(); }