Acl.cpp
Upload User: kklily621
Upload Date: 2013-06-25
Package Size: 252k
Code Size: 10k
Development Platform:

Visual C++

  1. // Acl.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Property.h"
  5. #include "Acl.h"
  6. //owner add
  7. #include "GuiRes.h"
  8. #include "AclSet.h"
  9. #include "MainSheet.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CAcl property page
  17. CAclSet* dlgAclSet = NULL;
  18. extern CAclFile m_AclFile;
  19. extern CPropertyApp theApp;
  20. extern CMainSheet *dlg;
  21. IMPLEMENT_DYNCREATE(CAcl, CPropertyPage)
  22. // static class member of variable
  23. CListCtrl CAcl::m_ListAcl;
  24. CAcl::CAcl() : CPropertyPage(CAcl::IDD)
  25. {
  26. //{{AFX_DATA_INIT(CAcl)
  27. // NOTE: the ClassWizard will add member initialization here
  28. //}}AFX_DATA_INIT
  29. }
  30. CAcl::~CAcl()
  31. {
  32. }
  33. void CAcl::DoDataExchange(CDataExchange* pDX)
  34. {
  35. CPropertyPage::DoDataExchange(pDX);
  36. //{{AFX_DATA_MAP(CAcl)
  37. DDX_Control(pDX, IDC_ACL_LIST , m_ListAcl);
  38. DDX_Control(pDX, IDC_ACL_RADIO_PASS , m_RadioPass);
  39. DDX_Control(pDX, IDC_ACL_RADIO_QUERY, m_RadioQuery);
  40. DDX_Control(pDX, IDC_ACL_RADIO_DENY , m_RadioDeny);
  41. //}}AFX_DATA_MAP
  42. }
  43. BEGIN_MESSAGE_MAP(CAcl, CPropertyPage)
  44. //{{AFX_MSG_MAP(CAcl)
  45. ON_BN_CLICKED(IDC_ACL_BUTTON_ADD , OnAclButtonAdd)
  46. ON_BN_CLICKED(IDC_ACL_BUTTON_EDIT , OnAclButtonEdit)
  47. ON_NOTIFY(LVN_ITEMCHANGED, IDC_ACL_LIST , OnItemchangedAclList)
  48. ON_NOTIFY(NM_DBLCLK, IDC_ACL_LIST , OnDblclkAclList)
  49. ON_NOTIFY(NM_CLICK, IDC_ACL_LIST , OnClickAclList)
  50. ON_BN_CLICKED(IDC_ACL_BUTTON_DELETE , OnAclButtonDelete)
  51. ON_BN_CLICKED(IDC_ACL_RADIO_DENY , OnAclRadioDeny)
  52. ON_BN_CLICKED(IDC_ACL_RADIO_PASS , OnAclRadioPass)
  53. ON_BN_CLICKED(IDC_ACL_RADIO_QUERY , OnAclRadioQuery)
  54. //}}AFX_MSG_MAP
  55. END_MESSAGE_MAP()
  56. //=============================================================================================
  57. // CAcl message handlers
  58. BOOL CAcl::OnInitDialog() 
  59. {
  60. CPropertyPage::OnInitDialog();
  61. InitDlgResource();
  62. return TRUE;
  63. }
  64. //---------------------------------------------------------------------------------------------
  65. //initialize dialog's resource
  66. void CAcl::InitDlgResource()
  67. {
  68. SetDlgItemText(IDC_ACL_APPLICATION_SET_LABLE ,GUI_ACL_APPLICATION_SET_LABLE);
  69. SetDlgItemText(IDC_ACL_RADIO_PASS ,GUI_ACL_RADIO_PASS);
  70. SetDlgItemText(IDC_ACL_RADIO_QUERY ,GUI_ACL_RADIO_QUERY);
  71. SetDlgItemText(IDC_ACL_RADIO_DENY ,GUI_ACL_RADIO_DENY);
  72. SetDlgItemText(IDC_ACL_SET_LABLE ,GUI_ACL_SET_LABLE);
  73. SetDlgItemText(IDC_ACL_BUTTON_ADD ,GUI_ACL_BUTTON_ADD);
  74. SetDlgItemText(IDC_ACL_BUTTON_EDIT ,GUI_ACL_BUTTON_EDIT);
  75. SetDlgItemText(IDC_ACL_BUTTON_DELETE ,GUI_ACL_BUTTON_DELETE);
  76. InitList(&m_ListAcl);
  77. Refresh();
  78. }
  79. void CAcl::Refresh()
  80. {
  81. m_ListAcl.DeleteAllItems();
  82. m_RadioPass.SetCheck(FALSE);
  83. m_RadioQuery.SetCheck(FALSE);
  84. m_RadioDeny.SetCheck(FALSE);
  85. for(DWORD i = 0; i < m_AclFile.mAclHeader.ulAclCount; i++)
  86. ListAddOne(m_AclFile.mpAcl + i, !i);
  87. m_iType = m_AclFile.GetBit(m_AclFile.mAclHeader.bSet,4,2); //bit 5, 6
  88. if(m_iType == 0)
  89. m_RadioPass .SetCheck(TRUE);
  90. else if(m_iType == 1)
  91. m_RadioQuery.SetCheck(TRUE);
  92. else if(m_iType == 2)
  93. m_RadioDeny .SetCheck(TRUE);
  94. else
  95. {
  96. AfxMessageBox(GUI_ACL_MESSAGE_ACL_FILE_SET_ERROR);
  97. return;
  98. }
  99. }
  100. void CAcl::InitList(CListCtrl *mList)
  101. {
  102. ListView_SetExtendedListViewStyle(mList->m_hWnd ,
  103. LVS_EX_GRIDLINES  | LVS_EX_FULLROWSELECT
  104. ); 
  105. mList->InsertColumn(0, GUI_ACL_LIST_ACTION,
  106. LVCFMT_LEFT, 
  107. GUI_ACL_LIST_ACTION_SIZE
  108. );
  109. mList->InsertColumn(1, GUI_ACL_LIST_APPLICATION ,
  110. LVCFMT_LEFT, 
  111. GUI_ACL_LIST_APPLICATION_SIZE + 40
  112. );
  113. mList->InsertColumn(2, GUI_ACL_LIST_DIRECTION,
  114. LVCFMT_LEFT, 
  115. GUI_ACL_LIST_DIRECTION_SIZE
  116. );
  117. mList->InsertColumn(3, GUI_ACL_LIST_REMOTE_NET,
  118. LVCFMT_LEFT, 
  119. GUI_ACL_LIST_REMOTE_NET_SIZE+ 30
  120. );
  121. mList->InsertColumn(4, GUI_ACL_LIST_ACCESS_TIME,
  122. LVCFMT_LEFT, 
  123. GUI_ACL_LIST_ACCESS_TIME_SIZE + 30
  124. );
  125. mList->InsertColumn(5, GUI_ACL_LIST_TYPE_PORT,
  126. LVCFMT_LEFT, 
  127. GUI_ACL_LIST_TYPE_PORT_SIZE
  128. );
  129. mList->InsertColumn(6, GUI_ACL_LIST_APPLICATION_PATH,
  130. LVCFMT_LEFT,
  131. GUI_ACL_LIST_APPLICATION_PATH_SIZE + 30
  132. );
  133. mList->InsertColumn(7, GUI_ACL_LIST_MEMO,
  134. LVCFMT_LEFT,
  135. GUI_ACL_LIST_MEMO_SIZE + 30
  136. );
  137. }
  138. int CAcl::ListAddOne(void* mpAcl, BOOL isSelected, BOOL isEdit, int EditIndex)
  139. {
  140. if(m_ListAcl.m_hWnd == NULL)
  141. return 0;
  142. XACL* mAcl = (XACL*)mpAcl;
  143. int iIndex = m_ListAcl.GetItemCount();
  144. if(isEdit) 
  145. iIndex = EditIndex;
  146. else 
  147. m_ListAcl.InsertItem(iIndex, GUI_ACTION[mAcl->bAction]);
  148. m_ListAcl.SetItemText(iIndex, 0, GUI_ACTION[mAcl->bAction]);
  149. m_ListAcl.SetItemText(iIndex, 1, CAclFile::GetName(mAcl->sApplication));
  150. m_ListAcl.SetItemText(iIndex, 2, GUI_DIRECTION[mAcl->bDirection]);
  151. m_ListAcl.SetItemText(iIndex, 3, GUI_NET[mAcl->bRemoteNetType]);
  152. m_ListAcl.SetItemText(iIndex, 4, GUI_TIME[mAcl->bAccessTimeType]);
  153. CString tmpStr;
  154. tmpStr.Format(_T("%s/%u"),GUI_SERVICE_TYPE[mAcl->bServiceType], mAcl->uiServicePort);
  155. m_ListAcl.SetItemText(iIndex,5,tmpStr);
  156. m_ListAcl.SetItemText(iIndex,6, CAclFile::GetPath(mAcl->sApplication));
  157. m_ListAcl.SetItemText(iIndex,7,mAcl->sMemo);
  158. if(isSelected)
  159. {
  160. m_ListAcl.EnsureVisible(iIndex,TRUE);
  161. m_ListAcl.SetItemState(iIndex,LVIS_SELECTED,LVIS_SELECTED);
  162. }
  163. return 0;
  164. }
  165. void CAcl::OnAclButtonAdd() 
  166. {
  167. if(!GetDlgItem(IDC_ACL_BUTTON_ADD)->IsWindowEnabled()) 
  168. return;
  169. if(InitAddAcl(_T("")) != 0)
  170. return;
  171. GetOwner()->GetDlgItem(ID_APPLY_NOW)->EnableWindow(TRUE);
  172. }
  173. int CAcl::InitAddAcl(TCHAR* sPathName, BOOL EnableComboApplication) 
  174. {
  175. if(MAX_ACL != 0 && m_AclFile.mAclHeader.ulAclCount >= MAX_ACL)
  176. {
  177. AfxMessageBox(GUI_ACL_MESSAGE_MAX_ACL);
  178. return -1;
  179. }
  180. XACL m_tmpAcl;
  181. m_tmpAcl.bAccessTimeType = ACL_TIME_TYPE_ALL;
  182. m_tmpAcl.bAction = ACL_ACTION_PASS;
  183. m_tmpAcl.bDirection = ACL_DIRECTION_IN_OUT;
  184. m_tmpAcl.bRemoteNetType = ACL_NET_TYPE_ALL;
  185. m_tmpAcl.bServiceType = ACL_SERVICE_TYPE_ALL;
  186. _tcscpy(m_tmpAcl.sApplication, _T(""));
  187. _tcscpy(m_tmpAcl.sMemo , _T(""));
  188. m_tmpAcl.uiServicePort = ACL_SERVICE_PORT_ALL;
  189. m_tmpAcl.ulAclID = 0;
  190. CAclSet::m_EnableComboApplication = EnableComboApplication;
  191. CAclSet::m_tmpAcl = m_tmpAcl;
  192. CAclSet::m_sPathName = sPathName;
  193. int iRet = ShowDlg();
  194. if(iRet == IDCANCEL)
  195. return IDCANCEL;
  196. m_tmpAcl = CAclSet::m_tmpAcl;
  197. if(m_AclFile.AddAcl(&m_tmpAcl,1) != 0)
  198. {
  199. AfxMessageBox(GUI_ACL_MESSAGE_ADD_ACL_ERROR);
  200. return -1;
  201. }
  202. if(m_ListAcl.m_hWnd != NULL)
  203. ListAddOne(&CAclSet::m_tmpAcl,TRUE);
  204. return 0;
  205. }
  206. BOOL WINAPI CAcl::AddAclQuery(TCHAR* sPathName, BOOL EnableComboApplication)
  207. {
  208. ODS("XFILTER.EXE: AddAclQuery");
  209. int iRet = InitAddAcl(sPathName, EnableComboApplication);
  210. if(iRet != 0)
  211. return FALSE;
  212. if(m_AclFile.SaveAcl() != XERR_SUCCESS)
  213. {
  214. AfxMessageBox(GUI_ACL_MESSAGE_SAVE_ACL_ERROR);
  215. return FALSE;
  216. }
  217. if(!theApp.InitDllData())
  218. {
  219. AfxMessageBox(GUI_ACL_MESSAGE_INIT_DLL_DATA_ERROR);
  220. return FALSE;
  221. }
  222. if(dlg != NULL)
  223. dlg->GetDlgItem(ID_APPLY_NOW)->EnableWindow(FALSE);
  224. return TRUE;
  225. }
  226. void CAcl::OnAclButtonEdit() 
  227. {
  228. if(!GetDlgItem(IDC_ACL_BUTTON_EDIT)->IsWindowEnabled())
  229. return;
  230. if(m_iListIndex < 0) 
  231. return;
  232. CAclSet::m_tmpAcl = m_AclFile.mpAcl[m_iListIndex];
  233. CAclSet::m_EnableComboApplication = TRUE;
  234. int iRet = ShowDlg();
  235. if(iRet == IDCANCEL) 
  236. return;
  237. m_AclFile .mpAcl[m_iListIndex] = CAclSet::m_tmpAcl;
  238. ListAddOne (&CAclSet::m_tmpAcl,FALSE,TRUE,m_iListIndex);
  239. GetOwner() -> GetDlgItem(ID_APPLY_NOW) -> EnableWindow(TRUE);
  240. }
  241. int CAcl::ShowDlg()
  242. {
  243. EnableMenu(FALSE);
  244. dlgAclSet = new CAclSet;
  245. int iRet = dlgAclSet->DoModal();
  246. delete dlgAclSet;
  247. dlgAclSet = NULL;
  248. EnableMenu(TRUE);
  249. return iRet;
  250. }
  251. UINT CAcl::EnableMenu(UINT bEnable)
  252. {
  253. theApp.m_EnablePacketMonitor = bEnable;
  254. theApp.m_EnableQueryLog  = bEnable;
  255. theApp.m_EnableAcl  = bEnable;
  256. theApp.m_EnableSystemSet  = bEnable;
  257. theApp.m_EnableAbout  = bEnable;
  258. if(!CAclSet::m_EnableComboApplication)
  259. {
  260. theApp.m_EnableExit = bEnable;
  261. theApp.m_EnableContolFrame = bEnable;
  262. }
  263. return bEnable;
  264. }
  265. void CAcl::OnItemchangedAclList(NMHDR* pNMHDR, LRESULT* pResult) 
  266. {
  267. NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  268. *pResult = 0;
  269. if((m_iListIndex = pNMListView->iItem) == -1) 
  270. return;
  271. EnableButton(TRUE);
  272. }
  273. void CAcl::EnableButton(BOOL bEnable)
  274. {
  275. GetDlgItem(IDC_ACL_BUTTON_EDIT) ->EnableWindow(bEnable);
  276. GetDlgItem(IDC_ACL_BUTTON_DELETE) ->EnableWindow(bEnable);
  277. }
  278. void CAcl::OnDblclkAclList(NMHDR* pNMHDR, LRESULT* pResult) 
  279. {
  280. NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  281. if((m_iListIndex = pNMListView->iItem) != -1) 
  282. OnAclButtonEdit();
  283. *pResult = 0;
  284. }
  285. void CAcl::OnClickAclList(NMHDR* pNMHDR, LRESULT* pResult) 
  286. {
  287. NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  288. if((m_iListIndex = pNMListView->iItem) == -1) 
  289. EnableButton(FALSE);
  290. *pResult = 0;
  291. }
  292. void CAcl::OnAclButtonDelete() 
  293. {
  294. if(!GetDlgItem(IDC_ACL_BUTTON_DELETE)->IsWindowEnabled())
  295. return;
  296. if(m_iListIndex < 0)
  297. return;
  298. int tmpIndex = m_iListIndex;
  299. m_AclFile.DelAcl(m_iListIndex, ACL_TYPE_ACL);
  300. m_ListAcl.DeleteItem(m_iListIndex);
  301. GetOwner()->GetDlgItem(ID_APPLY_NOW)->EnableWindow(TRUE);
  302. if(m_ListAcl.GetItemCount() <= 0)
  303. {
  304. EnableButton(FALSE);
  305. return;
  306. }
  307. if(tmpIndex == m_ListAcl.GetItemCount())
  308. tmpIndex -- ;
  309. m_ListAcl.SetItemState(tmpIndex, LVIS_SELECTED, LVIS_SELECTED);
  310. }
  311. void CAcl::OnAclRadioDeny() 
  312. {
  313. SetType(2, TRUE, FALSE); //binary 10
  314. }
  315. void CAcl::OnAclRadioPass() 
  316. {
  317. SetType(0, FALSE, FALSE); //binary 00
  318. }
  319. void CAcl::OnAclRadioQuery() 
  320. {
  321. SetType(1, FALSE, TRUE); //binary 01
  322. }
  323. BOOL CAcl::SetType(int type, BOOL bit4, BOOL bit5)
  324. {
  325. if(type == m_iType)
  326. return FALSE;
  327. m_AclFile.SetBit(&m_AclFile.mAclHeader.bSet, 4, bit4);
  328. m_AclFile.SetBit(&m_AclFile.mAclHeader.bSet, 5, bit5);
  329. m_iType = type;
  330. GetOwner()->GetDlgItem(ID_APPLY_NOW)->EnableWindow(TRUE);
  331. return TRUE;
  332. }