// amisafeDlg.cpp : implementation file // #include "stdafx.h" #include "amisafe.h" #include "amisafeDlg.h" #include "Security.h" #include "SendMail.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define ICONID_GREENCHECK 0 #define ICONID_REDCROSS 1 #define ICONID_BLUEDOT 2 BEGIN_MESSAGE_MAP(CAmisafeDlg, CDialog) //{{AFX_MSG_MAP(CAmisafeDlg) ON_WM_CLOSE() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CAmisafeDlg dialog CAmisafeDlg::CAmisafeDlg(CWnd* pParent /*=NULL*/) : CDialog(CAmisafeDlg::IDD, pParent), hThread(NULL) { //{{AFX_DATA_INIT(CAmisafeDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); imagelist.Create(IDB_BITMAP1, 16, 0, RGB(255,255,255)); // find out who to send to from the command line. szRecipients[0] = '\0'; #if 0 LPTSTR szCmdLine = GetCommandLine(); if (szCmdLine != NULL) { if (*szCmdLine == '"') { for (szCmdLine++; *szCmdLine != '"'; szCmdLine++); } while (*szCmdLine == ' ') szCmdLine++; strncpy(szRecipients, szCmdLine, sizeof(szRecipients) / sizeof(TCHAR) - 1); szRecipients[sizeof(szRecipients) / sizeof(TCHAR) - 1] = '\0'; } #else if (__argc > 1 && *__argv[1] != '\0') { strncpy(szRecipients, __argv[1], sizeof(szRecipients) / sizeof(TCHAR) - 1); szRecipients[sizeof(szRecipients) / sizeof(TCHAR) - 1] = '\0'; } #endif // if we still do not have a valid recipient, then apply a default. if (lstrlen(szRecipients) < 2) { if (!CSecurity::GetLoggedInUsername(szRecipients, sizeof(szRecipients) / sizeof(TCHAR))) { strcpy(szRecipients, "dbayer"); } } } ///////////////////////////////////////////////////////////////////////////// // CAmisafeDlg message handlers BOOL CAmisafeDlg::OnInitDialog() { CDialog::OnInitDialog(); HWND hwndList = ::GetDlgItem(GetSafeHwnd(), IDC_LIST1); if (!hwndList) return FALSE; if (!listcontrol.Attach(hwndList)) return FALSE; listcontrol.SetImageList(&imagelist, LVSIL_SMALL); RECT listrect; listcontrol.GetClientRect(&listrect); listcontrol.InsertColumn(0, "text", LVCFMT_LEFT, listrect.right); SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here listcontrol.DeleteAllItems(); InsertMessage("Security checker starting up...", ICONID_BLUEDOT); hThread = ::CreateThread(NULL, 0, ThreadProc, (LPVOID) this, 0, NULL); return TRUE; // return TRUE unless you set the focus to a control } void CAmisafeDlg::RunSecurityCheck() { // // Determine if our process token is a member of the Administrators group. // Sleep(2000); if (CSecurity::IsAdministrator()) { InsertMessage("Running with Administrator privileges", ICONID_GREENCHECK); } else { InsertMessage("Running without Administrator privileges", ICONID_REDCROSS); } // // Determine if our process token is "untrusted" and does not have access to // resources that are ACLed specifically to the TokenUser SID. // Sleep(2000); if (CSecurity::IsUntrusted()) { InsertMessage("Running in an untrusted environment", ICONID_REDCROSS); } else { InsertMessage("Running as trusted code", ICONID_GREENCHECK); } // // Perform a simple MAPI test to send an email to someone. // Sleep(2000); InsertMessage("Attempting to initialize MAPI...", ICONID_BLUEDOT); { CInitMapi initmapi; if (HR_FAILED(initmapi.InitMapi())) { AppendToLastMessage("fail"); InsertMessage("Failed to initialize MAPI", ICONID_REDCROSS); } else { AppendToLastMessage("ok"); Sleep(500); // // Try to resolve some addresses to prove that we can // access the MAPI address book. // CAddressEnum addrenum(initmapi); char szNameBuffer[100]; for (int i = 0; ; i++) { // figure out which address we will look up. LPSTR szSourceName = NULL; switch (i) { case 0: szSourceName = "billg"; break; case 1: szSourceName = "steve bal"; break; case 2: szSourceName = "daveth"; break; case 3: szSourceName = "praerit"; break; case 4: szSourceName = "jeff lawson"; break; } if (szSourceName == NULL) break; // log something within the window. InsertMessage("Looking up ", ICONID_BLUEDOT); AppendToLastMessage(szSourceName); AppendToLastMessage("..."); // do the resolution. if (HR_FAILED(addrenum.LookupAddress(szSourceName, szNameBuffer, sizeof(szNameBuffer)))) { AppendToLastMessage("fail"); } else { AppendToLastMessage(szNameBuffer); } } // // Compose an outgoing email to a specified recipient // InsertMessage("Creating an outgoing e-mail...", ICONID_BLUEDOT); CSendMail sendmail(initmapi); if (HR_FAILED(sendmail.CreateMail("Test Message from AMISAFE"))) { AppendToLastMessage("fail"); InsertMessage("Failed to create MAPI message", ICONID_REDCROSS); } else { if (HR_FAILED(sendmail.SetRecipients(szRecipients))) { AppendToLastMessage("fail"); InsertMessage("Failed to send to ", ICONID_REDCROSS); AppendToLastMessage(szRecipients); } else { AppendToLastMessage("ok"); Sleep(500); InsertMessage("Starting e-mail transmission...", ICONID_BLUEDOT); if (HR_FAILED(sendmail.Transmit())) { AppendToLastMessage("fail"); InsertMessage("Failed to transmit MAPI message", ICONID_REDCROSS); } else { AppendToLastMessage("ok"); InsertMessage("Successfully sent to ", ICONID_GREENCHECK); AppendToLastMessage(szRecipients); } } } } } Sleep(2000); InsertMessage("Finished tests.", ICONID_BLUEDOT); } DWORD WINAPI CAmisafeDlg::ThreadProc(LPVOID lpParameter) { ((CAmisafeDlg*)lpParameter)->RunSecurityCheck(); return 0; } void CAmisafeDlg::InsertMessage(LPCSTR szMessage, DWORD dwIconId) { listcontrol.InsertItem(listcontrol.GetItemCount(), szMessage, dwIconId); listcontrol.UpdateWindow(); } void CAmisafeDlg::AppendToLastMessage(LPCSTR szMessage, DWORD dwNewIconId) { int count = listcontrol.GetItemCount(); if (count > 0) { char szBuffer[200] = ""; listcontrol.GetItemText(count - 1, 0, szBuffer, sizeof(szBuffer)); strncat(szBuffer, szMessage, sizeof(szBuffer) - strlen(szBuffer) - 1); szBuffer[sizeof(szBuffer) - 1] = '\0'; listcontrol.SetItemText(count - 1, 0, szBuffer); listcontrol.UpdateWindow(); } } void CAmisafeDlg::OnClose() { if (hThread != NULL) { InsertMessage("waiting for shutdown", ICONID_BLUEDOT); TerminateThread(hThread, 0); // not the nicest thing Sleep(500); WaitForSingleObject(hThread, INFINITE); hThread = NULL; } CDialog::OnClose(); }