// AdminDlg.cpp : implementation file // #include "stdafx.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif extern CDICOMSRVApp theApp; ///////////////////////////////////////////////////////////////////////////// // CAdminDlg dialog CAdminDlg::CAdminDlg(CWnd* pParent /*=NULL*/) : CDialog(CAdminDlg::IDD, pParent) { //{{AFX_DATA_INIT(CAdminDlg) m_sServerAETitle = _T(""); m_uServerPort = 0; m_nTimeOut = 0; m_nMaxClients = 0; //}}AFX_DATA_INIT m_bEnableEditing = TRUE; m_pUserList = NULL; m_pEventLog = NULL; } void CAdminDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAdminDlg) DDX_Control(pDX, IDC_LIST2, m_EventLog); DDX_Control(pDX, IDC_LIST1, m_UserList); DDX_Text(pDX, IDC_EDIT1, m_sServerAETitle); DDX_Text(pDX, IDC_EDIT2, m_uServerPort); DDV_MinMaxUInt(pDX, m_uServerPort, 1, 99999); DDX_Text(pDX, IDC_EDIT3, m_nTimeOut); DDV_MinMaxInt(pDX, m_nTimeOut, 1, 5); DDX_Text(pDX, IDC_EDIT4, m_nMaxClients); DDV_MinMaxInt(pDX, m_nMaxClients, 1, 99); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAdminDlg, CDialog) //{{AFX_MSG_MAP(CAdminDlg) ON_BN_CLICKED(IDC_BUTTON5, OnButton5) ON_BN_CLICKED(IDC_BUTTON3, OnButton3) ON_BN_CLICKED(IDC_BUTTON1, OnButton1) ON_BN_CLICKED(IDC_BUTTON2, OnButton2) ON_BN_CLICKED(IDOK, OnClose) ON_BN_CLICKED(IDC_SEC_TLS, OnSecTls) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CAdminDlg message handlers BOOL CAdminDlg::OnInitDialog() { CDialog::OnInitDialog(); long x; if(!m_bEnableEditing) { ::EnableWindow(GetDlgItem(IDC_EDIT1)->m_hWnd, FALSE); ::EnableWindow(GetDlgItem(IDC_EDIT2)->m_hWnd, FALSE); ::EnableWindow(GetDlgItem(IDC_EDIT3)->m_hWnd, FALSE); ::EnableWindow(GetDlgItem(IDC_EDIT4)->m_hWnd, FALSE); ::EnableWindow(GetDlgItem(IDC_SEC_NONE)->m_hWnd, FALSE); ::EnableWindow(GetDlgItem(IDC_SEC_ISCL)->m_hWnd, FALSE); ::EnableWindow(GetDlgItem(IDC_SEC_TLS)->m_hWnd, FALSE); } if(!m_pUserList) EndDialog(IDCANCEL); if(!m_pEventLog) EndDialog(IDCANCEL); // image list CBitmap Bitmap; m_UserList.InsertColumn(0, "User", LVCFMT_LEFT, 100, 0); m_UserList.InsertColumn(1, "IP", LVCFMT_LEFT, 100, 1); m_UserList.InsertColumn(2, "Port", LVCFMT_LEFT, 50, 2); m_UserList.InsertColumn(3, "Timeout", LVCFMT_LEFT, 50, 3); m_EventLog.InsertColumn(0, "Date", LVCFMT_LEFT, 175, 0); m_EventLog.InsertColumn(1, "User", LVCFMT_LEFT, 125, 1); m_EventLog.InsertColumn(2, "Event", LVCFMT_LEFT, 300, 2); m_Image.Create(16, 16, ILC_MASK, 0, 2); Bitmap.LoadBitmap(IDB_BITMAP1); m_Image.Add(&Bitmap, (COLORREF)0xFFFFFF); Bitmap.DeleteObject(); Bitmap.LoadBitmap(IDB_BITMAP2); m_Image.Add(&Bitmap, (COLORREF)0xFFFFFF); Bitmap.DeleteObject(); m_UserList.SetImageList(&m_Image, LVSIL_SMALL); m_EventLog.SetImageList(&m_Image, LVSIL_SMALL); LV_ITEM lvi; TCHAR szBuffer[1024]; for(x = 0; x < m_pEventLog->GetItemCount(); x++) { lvi.mask = LVIF_TEXT; lvi.iItem = x; lvi.iSubItem = 0; lvi.pszText = szBuffer; lvi.cchTextMax = sizeof(szBuffer) / sizeof(TCHAR); if (m_pEventLog->GetItem(&lvi)) { lvi.mask = LVIF_TEXT | LVIF_IMAGE; lvi.iImage = 0; m_EventLog.InsertItem(&lvi); lvi.mask = LVIF_TEXT; lvi.iSubItem = 1; if (m_pEventLog->GetItem(&lvi)) m_EventLog.SetItem(&lvi); lvi.iSubItem = 2; if (m_pEventLog->GetItem(&lvi)) m_EventLog.SetItem(&lvi); } } for (x = 0; x < m_pUserList->GetItemCount(); x++) { lvi.mask = LVIF_TEXT; lvi.iItem = x; lvi.iSubItem = 0; lvi.pszText = szBuffer; lvi.cchTextMax = sizeof(szBuffer) / sizeof(TCHAR); if (m_pUserList->GetItem(&lvi)) { lvi.mask = LVIF_TEXT | LVIF_IMAGE; lvi.iImage = 1; m_UserList.InsertItem(&lvi); lvi.mask = LVIF_TEXT; lvi.iSubItem = 1; if (m_pUserList->GetItem(&lvi)) m_UserList.SetItem(&lvi); lvi.iSubItem = 2; if (m_pUserList->GetItem(&lvi)) m_UserList.SetItem(&lvi); lvi.iSubItem = 3; if (m_pUserList->GetItem(&lvi)) m_UserList.SetItem(&lvi); } } switch (m_SecureMode) { case DICOM_SECURE_NONE: { CheckRadioButton(IDC_SEC_NONE, IDC_SEC_TLS, IDC_SEC_NONE); break; } case DICOM_SECURE_ISCL: { CheckRadioButton(IDC_SEC_NONE, IDC_SEC_TLS, IDC_SEC_ISCL); break; } case DICOM_SECURE_TLS: { CheckRadioButton(IDC_SEC_NONE, IDC_SEC_TLS, IDC_SEC_TLS); break; } } return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CleanDir(CString &strDirPath) { CFileFind FileFinder; BOOL bBusy = FileFinder.FindFile(strDirPath + "\\*.*"); while (bBusy) { bBusy = FileFinder.FindNextFile(); if (FileFinder.IsDots()) continue; if (FileFinder.IsDirectory()) { CString s = FileFinder.GetFilePath(); CleanDir(s); RemoveDirectory(FileFinder.GetFilePath()); continue; } DeleteFile( FileFinder.GetFilePath() ); } } void CAdminDlg::OnButton5() { //clear the event list m_pEventLog->DeleteAllItems(); m_EventLog.DeleteAllItems(); CDICOMSRVApp *pApp = (CDICOMSRVApp *)AfxGetApp(); if(pApp) { CleanDir(pApp->m_sLogFolder); } } void CAdminDlg::OnClose() { int nMode = GetCheckedRadioButton(IDC_SEC_NONE, IDC_SEC_TLS); switch (nMode) { case IDC_SEC_NONE: m_SecureMode = DICOM_SECURE_NONE; break; case IDC_SEC_ISCL: m_SecureMode = DICOM_SECURE_ISCL; break; case IDC_SEC_TLS: m_SecureMode = DICOM_SECURE_TLS; break; } CDialog::OnOK(); } void CAdminDlg::OnButton3() { int n; n = m_UserList.GetNextItem(-1, LVNI_SELECTED); if (n != -1) { CDICOMSRVDlg* pParent = (CDICOMSRVDlg*) GetParent(); pParent->LogEvent(theApp.m_sServerAETitle, "Removed User - " + m_UserList.GetItemText(n, 0)); m_UserList.DeleteItem(n); pParent->m_UserList.DeleteItem(n); } } void CAdminDlg::OnButton1() { CUserPropDlg dlg; int nPos; if (dlg.DoModal() == IDOK) { char szPortNumber[16]; char szTimeout[16]; itoa(dlg.m_uPortNumber, szPortNumber, 10); itoa(dlg.m_uTimeOut, szTimeout, 10); nPos = m_UserList.InsertItem(m_UserList.GetItemCount(), dlg.m_sAETitle, 1); if (nPos != -1) { m_UserList.SetItemText(nPos, 1, dlg.m_sIPAddress); m_UserList.SetItemText(nPos, 2, szPortNumber); m_UserList.SetItemText(nPos, 3, szTimeout); } nPos = m_pUserList->InsertItem(m_pUserList->GetItemCount(), dlg.m_sAETitle); if (nPos != -1) { m_pUserList->SetItemText(nPos, 1, dlg.m_sIPAddress); m_pUserList->SetItemText(nPos, 2, szPortNumber); m_pUserList->SetItemText(nPos, 3, szTimeout); } CDICOMSRVDlg* pParent = (CDICOMSRVDlg*) GetParent(); pParent->LogEvent(theApp.m_sServerAETitle, "Added User - " + dlg.m_sAETitle); } } void CAdminDlg::OnButton2() { CUserPropDlg dlg; int nPos; nPos = m_UserList.GetNextItem(-1, LVNI_SELECTED); if (nPos != -1) { dlg.m_sAETitle = m_UserList.GetItemText(nPos, 0); dlg.m_sIPAddress = m_UserList.GetItemText(nPos, 1); dlg.m_uPortNumber = atoi(m_UserList.GetItemText(nPos, 2)); dlg.m_uTimeOut = atoi(m_UserList.GetItemText(nPos, 3)); if (dlg.DoModal() == IDOK) { char szPortNumber[16]; char szTimeout[16]; itoa(dlg.m_uPortNumber, szPortNumber, 10); itoa(dlg.m_uTimeOut, szTimeout, 10); m_UserList.SetItemText(nPos, 0, dlg.m_sAETitle); m_UserList.SetItemText(nPos, 1, dlg.m_sIPAddress); m_UserList.SetItemText(nPos, 2, szPortNumber); m_UserList.SetItemText(nPos, 3, szTimeout); m_pUserList->SetItemText(nPos, 0, dlg.m_sAETitle); m_pUserList->SetItemText(nPos, 1, dlg.m_sIPAddress); m_pUserList->SetItemText(nPos, 2, szPortNumber); m_pUserList->SetItemText(nPos, 3, szTimeout); } } } L_INT CAdminDlg::GetServerPrivateKeyPassword(HWND hWndParent) { L_INT nRet = DICOM_SUCCESS; CString strServerCertName; theApp.m_hWndParent = hWndParent; if (!theApp.m_bValidPrivateKeyPassword) { CNetPassword *pNet = new CNetPassword(); if (pNet) { theApp.GetCertName(SERVER_CERT_NAME, strServerCertName); nRet = pNet->SetClientCertificateTLS( (LPSTR) (LPCSTR)strServerCertName, L_TLS_FILETYPE_PEM, NULL); if (nRet == DICOM_SUCCESS) { theApp.m_bValidPrivateKeyPassword = TRUE; } else { theApp.m_strPrivateKeyPassword = ""; theApp.m_bValidPrivateKeyPassword = FALSE; } delete pNet; } } return nRet; } void CAdminDlg::OnSecTls() { // TODO: Add your control notification handler code here CWnd *pWnd = NULL; pWnd = GetDlgItem(IDOK); if (pWnd) pWnd->EnableWindow(FALSE); if (IsDlgButtonChecked(IDC_SEC_TLS)) { // Check to make sure server.pem exists CString strServerCertName; theApp.GetCertName(SERVER_CERT_NAME, strServerCertName); if (_access((LPSTR)(LPCSTR)strServerCertName, 4)!=0) { CString strMsg; strMsg.Format("Certificate file does not exist: %s", strServerCertName); MessageBox(strMsg, "Warning", MB_OK | MB_ICONEXCLAMATION); m_SecureMode = DICOM_SECURE_NONE; theApp.m_bValidPrivateKeyPassword = FALSE; CheckRadioButton(IDC_SEC_NONE, IDC_SEC_TLS, IDC_SEC_NONE); } else if (DICOM_SUCCESS != GetServerPrivateKeyPassword(m_hWnd)) { MessageBox("Incorrect password for server certificate.", "Error", MB_OK | MB_ICONERROR); m_SecureMode = DICOM_SECURE_NONE; theApp.m_bValidPrivateKeyPassword = FALSE; CheckRadioButton(IDC_SEC_NONE, IDC_SEC_TLS, IDC_SEC_NONE); } } GetDlgItem(IDOK)->EnableWindow(TRUE); }