// EdWldRul.cpp : implementation file // #include "stdafx.h" #include #include "ListRow.h" #include "ChkLstCt.h" extern "C" { #include #include } #include "Iismap.hxx" #include "Iiscmr.hxx" #include "brwsdlg.h" #include "certmap.h" #include "EdWldRul.h" #include "EdtRulEl.h" #include "IssueDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define ACCESS_DENY 0 #define ACCESS_ACCEPT 1 #define MATCH_ISSUER_ALL 0 #define MATCH_ISSUER_SOME 1 #define COL_CERT_FIELD 0 #define COL_SUB_FIELD 1 #define COL_MATCH_CRITERIA 2 // notes on the list: // the list is the only source of current data for the rule elements. The actual // rule object is not updated with changes in the list until the user hits IDOK. // that way we can cancel without changing the object. All mapping between the // text in the list and the binary formats used by the server are done at the // beginning and end of the dialog ///////////////////////////////////////////////////////////////////////////// // CEditWildcardRule dialog //--------------------------------------------------------------------------- CEditWildcardRule::CEditWildcardRule(IMSAdminBase* pMB, CWnd* pParent /*=NULL*/) : CNTBrowsingDialog(CEditWildcardRule::IDD, pParent), m_pMB(pMB) { //{{AFX_DATA_INIT(CEditWildcardRule) m_sz_description = _T(""); m_bool_enable = FALSE; m_int_MatchAllIssuers = -1; m_int_DenyAccess = -1; //}}AFX_DATA_INIT } //--------------------------------------------------------------------------- void CEditWildcardRule::DoDataExchange(CDataExchange* pDX) { CNTBrowsingDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CEditWildcardRule) DDX_Control(pDX, IDC_EDIT, m_cbutton_edit); DDX_Control(pDX, IDC_DELETE, m_cbutton_delete); DDX_Control(pDX, IDC_NEW, m_cbutton_new); DDX_Control(pDX, IDC_LIST, m_clistctrl_list); DDX_Text(pDX, IDC_DESCRIPTION, m_sz_description); DDX_Check(pDX, IDC_ENABLE_RULE, m_bool_enable); DDX_Radio(pDX, IDC_ALL_ISSUERS, m_int_MatchAllIssuers); DDX_Radio(pDX, IDC_REFUSE_LOGON, m_int_DenyAccess); //}}AFX_DATA_MAP } //--------------------------------------------------------------------------- BEGIN_MESSAGE_MAP(CEditWildcardRule, CNTBrowsingDialog) //{{AFX_MSG_MAP(CEditWildcardRule) ON_NOTIFY(NM_DBLCLK, IDC_LIST, OnDblclkList) ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST, OnItemchangedList) ON_BN_CLICKED(IDC_EDIT, OnEdit) ON_BN_CLICKED(IDC_NEW, OnNew) ON_BN_CLICKED(IDC_DELETE, OnDelete) ON_BN_CLICKED(IDC_SELECT_ISSUER, OnSelectIssuer) //}}AFX_MSG_MAP END_MESSAGE_MAP() //--------------------------------------------------------------------------- BOOL CEditWildcardRule::FInitRulesList() { CString sz; int i; // setup the main field sz.LoadString( IDS_CERT_FIELD ); i = m_clistctrl_list.InsertColumn( COL_CERT_FIELD, sz, LVCFMT_LEFT, 100 ); // setup the sub field sz.LoadString( IDS_SUB_FIELD ); i = m_clistctrl_list.InsertColumn( COL_SUB_FIELD, sz, LVCFMT_LEFT, 70 ); // setup the match criteria column sz.LoadString( IDS_MATCH_CRITERIA ); i = m_clistctrl_list.InsertColumn( COL_MATCH_CRITERIA, sz, LVCFMT_LEFT, 255 ); return TRUE; } //--------------------------------------------------------------------------- BOOL CEditWildcardRule::FillRulesList() { CERT_FIELD_ID idCertField; LPBYTE pContent; DWORD cbContent; LPSTR psz; CString sz; int i; // get the number of subfield rules DWORD cbRules = m_pRule->GetRuleElemCount(); // loop the elements, adding each to the list for ( DWORD j = 0; j < cbRules; j++ ) { // get the raw data for the rule element if ( !m_pRule->GetRuleElem( j, &idCertField, (PCHAR*)&pContent, &cbContent, &psz ) ) continue; // the call failed - try the next // start converting the data into readable form and adding it to the list sz = MapIdToField( idCertField ); // create the new entry in the list box. i = m_clistctrl_list.InsertItem( j, sz ); // add the subfield data sz = MapAsn1ToSubField( psz ); m_clistctrl_list.SetItemText( i, COL_SUB_FIELD, sz ); // add the content data - reuse the psz pointer if ( BinaryToMatchRequest( pContent, cbContent, &psz ) ) m_clistctrl_list.SetItemText( i, COL_MATCH_CRITERIA, psz ); // finally, attach the id cert field as user data to the item m_clistctrl_list.SetItemData( i, idCertField ); } return TRUE; } // editing and updating //--------------------------------------------------------------------------- void CEditWildcardRule::EnableDependantButtons() { // the whole purpose of this routine is to gray or activate // the edit and delete buttons depending on whether or not anything // is selected. So start by getting the selection count UINT cItemsSel = m_clistctrl_list.GetSelectedCount(); if ( cItemsSel > 0 ) { // there are items selected m_cbutton_edit.EnableWindow( TRUE ); m_cbutton_delete.EnableWindow( TRUE ); } else { // nope. Nothing selected m_cbutton_edit.EnableWindow( FALSE ); m_cbutton_delete.EnableWindow( FALSE ); } // always enable the new button m_cbutton_new.EnableWindow( TRUE ); } //--------------------------------------------------------------------------- BOOL CEditWildcardRule::EditRule( DWORD iList ) { // declare the editing dialog CEditRuleElement editDlg; // fill in its data editDlg.m_int_field = m_clistctrl_list.GetItemData( iList ); editDlg.m_sz_subfield = m_clistctrl_list.GetItemText( iList, COL_SUB_FIELD ); editDlg.m_sz_criteria = m_clistctrl_list.GetItemText( iList, COL_MATCH_CRITERIA ); // run the dialog if ( editDlg.DoModal() == IDOK ) { // must convert the field into a string too CERT_FIELD_ID id = (CERT_FIELD_ID)editDlg.m_int_field; CString sz = MapIdToField( id ); m_clistctrl_list.SetItemText( iList, COL_CERT_FIELD, sz ); m_clistctrl_list.SetItemData( iList, id ); m_clistctrl_list.SetItemText( iList, COL_SUB_FIELD, editDlg.m_sz_subfield ); m_clistctrl_list.SetItemText( iList, COL_MATCH_CRITERIA, editDlg.m_sz_criteria ); } return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CEditWildcardRule message handlers //--------------------------------------------------------------------------- BOOL CEditWildcardRule::OnInitDialog() { // call the parental oninitdialog BOOL f = CNTBrowsingDialog::OnInitDialog(); // set the easy default strings m_sz_accountname = m_pRule->GetRuleAccount(); // managed by CNTBrowsingDialog from here on m_sz_description = m_pRule->GetRuleName(); m_bool_enable = m_pRule->GetRuleEnabled(); // set up the deny access radio buttons if ( m_pRule->GetRuleDenyAccess() ) m_int_DenyAccess = ACCESS_DENY; else m_int_DenyAccess = ACCESS_ACCEPT; // set up the match issuer buttons if ( m_pRule->GetMatchAllIssuer() ) m_int_MatchAllIssuers = MATCH_ISSUER_ALL; else m_int_MatchAllIssuers = MATCH_ISSUER_SOME; // initialize the list FInitRulesList(); FillRulesList(); EnableDependantButtons(); // initialize the password m_sz_password = m_pRule->GetRulePassword(); // exchange the data UpdateData( FALSE ); // return the answer return f; } //--------------------------------------------------------------------------- // this is the part where we fill in most of the items void CEditWildcardRule::OnOK() { CERT_FIELD_ID id; CString szSub, sz; LPBYTE pbBin; DWORD cbBin; UINT cItems; UINT iItem; // update the data UpdateData( TRUE ); //======== store the rule elements // start by resetting the entire rule - that way we don't have to // mess with individual elements in the list, allowing us to cancel. // But that is ok, because we can just spin through // the ones in the list very quickly and re-add them // remove the existing elements from the list. cItems = m_pRule->GetRuleElemCount(); for ( iItem = 0; iItem < cItems; iItem++ ) m_pRule->DeleteRuleElem( 0 ); // add all the items in the list cItems = m_clistctrl_list.GetItemCount(); for ( iItem = 0; iItem < cItems; iItem++ ) { // prepare the field id id = (CERT_FIELD_ID)m_clistctrl_list.GetItemData( iItem ); // prepare the subfield sz = m_clistctrl_list.GetItemText(iItem, COL_SUB_FIELD); szSub = MapSubFieldToAsn1( (PCHAR)(LPCSTR)sz ); // prepare the data sz = m_clistctrl_list.GetItemText(iItem, COL_MATCH_CRITERIA); if ( !MatchRequestToBinary((PCHAR)(LPCSTR)sz, &pbBin, &cbBin) ) continue; // add the element to the rule m_pRule->AddRuleElem( 0xffffffff, id, (PCHAR)(LPCSTR)szSub, pbBin, cbBin ); // free the binary match data FreeMatchConversion( pbBin ); } // set the easy data m_pRule->SetRuleName( (PCHAR)(LPCSTR)m_sz_description ); m_pRule->SetRuleEnabled( m_bool_enable ); // store the deny access radio buttons m_pRule->SetRuleDenyAccess( m_int_DenyAccess == ACCESS_DENY ); // store the match issuer buttons m_pRule->SetMatchAllIssuer( m_int_MatchAllIssuers == MATCH_ISSUER_ALL ); // we have to set the account name into place here m_pRule->SetRuleAccount( (PCHAR)(LPCSTR)m_sz_accountname ); // store the password m_pRule->SetRulePassword( (PCHAR)(LPCSTR)m_sz_password ); // it is valid CNTBrowsingDialog::OnOK(); } //--------------------------------------------------------------------------- void CEditWildcardRule::OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult) { *pResult = 0; // if something in the list was double clicked, edit it if ( m_clistctrl_list.GetSelectedCount() > 0 ) OnEdit(); } //--------------------------------------------------------------------------- void CEditWildcardRule::OnItemchangedList(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; *pResult = 0; // enable the correct items EnableDependantButtons(); } //--------------------------------------------------------------------------- void CEditWildcardRule::OnEdit() { ASSERT( m_clistctrl_list.GetSelectedCount() == 1 ); DWORD iList; // get index of the selected list item iList = m_clistctrl_list.GetNextItem( -1, LVNI_SELECTED ); ASSERT( iList >= 0 ); // edit the item EditRule( iList ); } //--------------------------------------------------------------------------- // actually very similar to editing an existing element void CEditWildcardRule::OnNew() { // declare the editing dialog CEditRuleElement editDlg; // fill in its data editDlg.m_int_field = CERT_FIELD_SUBJECT; // editDlg.m_sz_subfield = MapAsn1ToSubField( "O" ); editDlg.m_sz_subfield = "O"; editDlg.m_sz_criteria.LoadString( IDS_WILDSTRING ); // run the dialog if ( editDlg.DoModal() == IDOK ) { // get the index for adding to the end of the list int iEnd = m_clistctrl_list.GetItemCount(); // Start with the cert field CERT_FIELD_ID id = (CERT_FIELD_ID)editDlg.m_int_field; CString sz = MapIdToField( id ); int i = m_clistctrl_list.InsertItem( iEnd, sz ); m_clistctrl_list.SetItemData( i, id ); m_clistctrl_list.SetItemText( i, COL_SUB_FIELD, editDlg.m_sz_subfield ); m_clistctrl_list.SetItemText( i, COL_MATCH_CRITERIA, editDlg.m_sz_criteria ); } } //--------------------------------------------------------------------------- void CEditWildcardRule::OnDelete() { ASSERT( m_clistctrl_list.GetSelectedCount() == 1 ); DWORD iList; // get index of the selected list item iList = m_clistctrl_list.GetNextItem( -1, LVNI_SELECTED ); ASSERT( iList >= 0 ); // delete the item from the display list m_clistctrl_list.DeleteItem ( iList ); } //--------------------------------------------------------------------------- // simple - just run the issuer dialog void CEditWildcardRule::OnSelectIssuer() { CSelectIssuersDlg dlg(m_pMB); // prep the dialog dlg.m_pRule = m_pRule; dlg.m_szMBPath = m_szMBPath; dlg.m_sz_caption.LoadString( IDS_MATCH_ON_ISSUERS ); // run it if ( dlg.DoModal() == IDOK ) { UpdateData( TRUE ); m_int_MatchAllIssuers = MATCH_ISSUER_SOME; UpdateData( FALSE ); } }