mirror of https://github.com/Cisco-Talos/clamav
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
277 lines
6.8 KiB
277 lines
6.8 KiB
// clamav.cpp : Defines the class behaviors for the application.
|
|
//
|
|
|
|
/*
|
|
* Copyright (C) 2004 Nigel Horne <njh@bandsman.co.uk>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
* MA 02110-1301, USA.
|
|
*/
|
|
#include "stdafx.h"
|
|
#include "resource.h"
|
|
|
|
#include "clamav.h"
|
|
|
|
#include "clamadoc.h"
|
|
#include "clamavw.h"
|
|
|
|
#include <winsock.h>
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CClamavApp
|
|
|
|
BEGIN_MESSAGE_MAP(CClamavApp, CWinApp)
|
|
//{{AFX_MSG_MAP(CClamavApp)
|
|
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
|
|
ON_COMMAND(ID_FILE_NEW, OnFileNew)
|
|
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
|
|
ON_COMMAND(ID_SET_OPTIONS, OnSetOptions)
|
|
//}}AFX_MSG_MAP
|
|
// Standard file based document commands
|
|
// ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
|
|
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
|
|
// Standard print setup command
|
|
ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CClamavApp construction
|
|
|
|
CClamavApp::CClamavApp()
|
|
{
|
|
// TODO: add construction code here,
|
|
// Place all significant initialization in InitInstance
|
|
}
|
|
|
|
CClamavApp::~CClamavApp()
|
|
{
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// The one and only CClamavApp object
|
|
|
|
CClamavApp theApp;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CClamavApp initialization
|
|
|
|
BOOL CClamavApp::InitInstance()
|
|
{
|
|
// Standard initialization
|
|
// If you are not using these features and wish to reduce the size
|
|
// of your final executable, you should remove from the following
|
|
// the specific initialization routines you do not need.
|
|
|
|
Enable3dControls();
|
|
|
|
LoadStdProfileSettings(); // Load standard INI file options (including MRU)
|
|
|
|
// Register the application's document templates. Document templates
|
|
// serve as the connection between documents, frame windows and views.
|
|
|
|
CSingleDocTemplate* pDocTemplate;
|
|
pDocTemplate = new CSingleDocTemplate(
|
|
IDR_MAINFRAME,
|
|
RUNTIME_CLASS(CClamavDoc),
|
|
RUNTIME_CLASS(CMainFrame), // main SDI frame window
|
|
RUNTIME_CLASS(CClamavView));
|
|
AddDocTemplate(pDocTemplate);
|
|
|
|
// Start up Winsock
|
|
WSAData wsaData;
|
|
|
|
if(WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
|
|
AfxMessageBox("WSAStartup() failed error code");
|
|
return FALSE;
|
|
}
|
|
clamServer = NULL;
|
|
|
|
if (m_lpCmdLine[0] != '\0') {
|
|
// TODO: add command line processing here
|
|
// First argument is the server, second is the file to scan
|
|
// TODO: more rigourous argument checking
|
|
CString args = CString(m_lpCmdLine);
|
|
|
|
int index = args.Find(' ');
|
|
if(index == -1)
|
|
exit(1);
|
|
|
|
CString server = args.Left(index);
|
|
const CString fileName = args.Mid(index + 1);
|
|
unsigned short port;
|
|
|
|
index = server.Find(':');
|
|
if(index != -1) {
|
|
port = (unsigned short)atoi(server.Mid(index + 1));
|
|
server = server.Left(index);
|
|
} else
|
|
port = DEFAULT_PORT;
|
|
|
|
TRY {
|
|
clamServer = new ClamServer(server, port);
|
|
} CATCH(CException, c) {
|
|
AfxMessageBox("Can't establish a connection to " + server);
|
|
c->Delete();
|
|
exit(1);
|
|
}
|
|
END_CATCH
|
|
|
|
CWinApp::OnFileNew();
|
|
|
|
// TODO: set quarantine directory
|
|
|
|
exit(clamServer->Scan(fileName, 0, (CMainFrame *)AfxGetMainWnd(), m_pMainWnd, TRUE, NULL) == TRUE);
|
|
} else {
|
|
// create a new (empty) document
|
|
OnFileNew();
|
|
}
|
|
|
|
#ifdef _DEBUG
|
|
afxTraceEnabled = TRUE;
|
|
#endif
|
|
|
|
options = new COptions();
|
|
recursive = TRUE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAboutDlg dialog used for App About
|
|
|
|
class CAboutDlg : public CDialog
|
|
{
|
|
public:
|
|
CAboutDlg();
|
|
|
|
// Dialog Data
|
|
//{{AFX_DATA(CAboutDlg)
|
|
enum { IDD = IDD_ABOUTBOX };
|
|
//}}AFX_DATA
|
|
|
|
// Implementation
|
|
protected:
|
|
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
|
|
//{{AFX_MSG(CAboutDlg)
|
|
// No message handlers
|
|
//}}AFX_MSG
|
|
DECLARE_MESSAGE_MAP()
|
|
};
|
|
|
|
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
|
|
{
|
|
//{{AFX_DATA_INIT(CAboutDlg)
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CAboutDlg)
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CAboutDlg)
|
|
// No message handlers
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
// App command to run the dialog
|
|
void CClamavApp::OnAppAbout()
|
|
{
|
|
CAboutDlg aboutDlg;
|
|
aboutDlg.DoModal();
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CClamavApp commands
|
|
|
|
int CClamavApp::ExitInstance()
|
|
{
|
|
// TODO: Add your specialized code here and/or call the base class
|
|
if(clamServer) {
|
|
delete clamServer;
|
|
clamServer = NULL;
|
|
}
|
|
if(options) {
|
|
delete options;
|
|
options = NULL;
|
|
}
|
|
WSACleanup();
|
|
|
|
return CWinApp::ExitInstance();
|
|
}
|
|
|
|
void CClamavApp::OnFileNew()
|
|
{
|
|
CWinApp::OnFileNew();
|
|
|
|
// TODO: Add your command handler code here
|
|
|
|
// Open connection to a different server
|
|
if(clamServer) {
|
|
delete clamServer;
|
|
clamServer = NULL;
|
|
}
|
|
TRY {
|
|
clamServer = new ClamServer;
|
|
} CATCH(CException, c) {
|
|
clamServer = NULL;
|
|
c->Delete();
|
|
}
|
|
END_CATCH
|
|
}
|
|
|
|
void CClamavApp::OnFileOpen()
|
|
{
|
|
// TODO: Add your command handler code here
|
|
|
|
CString newName;
|
|
if (!DoPromptFileName(newName, AFX_IDS_OPENFILE,
|
|
/*OFN_HIDEREADONLY |*/ OFN_FILEMUSTEXIST, TRUE, NULL))
|
|
return; // open cancelled
|
|
|
|
// OpenDocumentFile(newName);
|
|
this->Scan(newName);
|
|
}
|
|
|
|
// TODO: More than one scan happen at once but the progress bar gets confused
|
|
// Need a new scanner class. Create a new instance everytime we scan something
|
|
// Pass clamServer as a parameter
|
|
// Scanner *s = new Scanner(clamServer, 0, (CMainFrame *)AfxGetMainWnd(), m_pMainWnd, recursive, options->m_quarantineDir);
|
|
// if(s->clean())
|
|
// AfxMessageBox("No virus found in " + filename);
|
|
// delete s;
|
|
|
|
void CClamavApp::Scan(const CString& filename)
|
|
{
|
|
if(clamServer == NULL)
|
|
AfxMessageBox("You must connect to a clamd server first");
|
|
else if(clamServer->Scan(filename, 0, (CMainFrame *)AfxGetMainWnd(), m_pMainWnd, recursive, options->m_quarantineDir))
|
|
AfxMessageBox("No virus found in " + filename);
|
|
}
|
|
|
|
void CClamavApp::OnSetOptions()
|
|
{
|
|
// TODO: Add your command handler code here
|
|
if(options->DoModal() == IDOK)
|
|
recursive = options->m_recursive;
|
|
}
|
|
|