424 lines
13 KiB
C++
424 lines
13 KiB
C++
|
// EdWldRul.cpp : implementation file
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include <iadmw.h>
|
||
|
|
||
|
#include "ListRow.h"
|
||
|
#include "ChkLstCt.h"
|
||
|
extern "C"
|
||
|
{
|
||
|
#include <wincrypt.h>
|
||
|
#include <sslsp.h>
|
||
|
}
|
||
|
#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 );
|
||
|
}
|
||
|
}
|