From 18923e403764c902e11aa2c8cd49c6f7335a9923 Mon Sep 17 00:00:00 2001 From: Mavridis Philippe Date: Fri, 5 Feb 2021 22:31:58 +0200 Subject: Added support for clamd scanning. This option has to be enabled in the new 'Backend' section of the Options dialog. Most configuration options are unavailable for use with 'clamdscan'. For more information on the inherited limitations see the man page for clamdscan(1). This resolves issue #17. Signed-off-by: Mavridis Philippe --- src/CMakeLists.txt | 2 +- src/backend.ui | 93 ++++++++++++ src/configdialog.cpp | 15 +- src/configdialog.h | 5 +- src/klamav.cpp | 2 +- src/klamavconfig.kcfg | 18 +++ src/klamscan.cpp | 2 +- src/scanviewer.cpp | 151 ++++++++++++------- src/scanviewer.h | 4 +- translations/messages/klamav.pot | 314 ++++++++++++++++++++++++--------------- 10 files changed, 429 insertions(+), 177 deletions(-) create mode 100644 src/backend.ui diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c6c8a91..2edf96b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -40,7 +40,7 @@ tde_add_executable( ${PROJECT_NAME} AUTOMOC activityviewer.cpp collectiondb.cpp configdialog.cpp klamavconfig.kcfgc archivelimits.ui archivetypes.ui specialfiletypes.ui - firstrunwizard.ui logoptions.ui + firstrunwizard.ui logoptions.ui backend.ui k3bjobprogressosd_mod.cpp LINK diff --git a/src/backend.ui b/src/backend.ui new file mode 100644 index 0000000..bec4513 --- /dev/null +++ b/src/backend.ui @@ -0,0 +1,93 @@ + +KlamBackend + + + KlamBackend + + + + 0 + 0 + 600 + 480 + + + + Scanning Backend + + + + unnamed + + + + backendConfig + + + Scanning Backend + + + + unnamed + + + + kcfg_ScannerClamscan + + + Standalone scanner + + + false + + + + + kcfg_ClamdMultiscan + + + Force Multiscan mode + + + true + + + + + kcfg_ScannerClamdscan + + + ClamAV daemon + + + true + + + + + + + backendHelpMessage + + + RichText + + + Here you can choose the backend you'd like to use with KlamAV. +<p><b>Standalone scanner</b> uses the 'clamscan' command to perform a scan. This backend is configurable via KlamAV, but takes longer to start. This backend is also the easiest to set up, as it does not require running a system-wide daemon.</p> +<p><b>ClamAV daemon</b> uses the 'clamdscan' command to perform a scan. This backend depends on a running instance of the <i>clamd</i> daemon and depends on the options of the daemon. This backend starts up faster and also makes use of the Multiscan feature.</p + + + + + + slotToggleClamdcan(bool) + + + init() + + + + ktextbrowser.h + + diff --git a/src/configdialog.cpp b/src/configdialog.cpp index d59d52d..94466db 100644 --- a/src/configdialog.cpp +++ b/src/configdialog.cpp @@ -14,6 +14,7 @@ email : markey@web.de ***************************************************************************/ #include "configdialog.h" +#include "backend.h" #include "archivelimits.h" #include "archivetypes.h" #include "specialfiletypes.h" @@ -30,6 +31,7 @@ email : markey@web.de #include #include #include +#include #include #include #include @@ -52,6 +54,7 @@ KlamavConfigDialog::KlamavConfigDialog( TQWidget *parent, const char* name, TDEC setWFlags( WDestructiveClose ); // IMPORTANT Don't simply change the page names, they are used as identifiers in other parts of the app. + m_klambackend = new KlamBackend( 0, "Scanning Backend" ); m_archivelimits = new ArchiveLimits( 0, "Archive Limits" ); m_archivetypes = new ArchiveTypes( 0, "Archive Types" ); m_emailprotection = new Sigtool ( 0, "E-mail protection" ); @@ -60,6 +63,10 @@ KlamavConfigDialog::KlamavConfigDialog( TQWidget *parent, const char* name, TDEC m_logoptions = new LogOptions( 0, "Event Logging" ); // add pages + addPage( m_klambackend, i18n( "Backend" ), "system-run", i18n( "Configure Scanning Backend" ) ); + connect( m_klambackend->kcfg_ScannerClamdscan, SIGNAL(toggled(bool)), this, SLOT(slotToggleClamdscan(bool)) ); + slotToggleClamdscan( m_klambackend->kcfg_ScannerClamdscan->isOn() ); // initial state + addPage( m_archivelimits, i18n( "Archive Limits" ), "ark", i18n( "Configure Archive Limits" ) ); addPage( m_archivetypes, i18n( "Archive Types" ), "application-x-tarz", i18n( "Configure Archive Types" ) ); addPage( m_emailprotection, i18n( "E-mail protection" ), "email", i18n( "Set up your e-mail client to use Klammail" ) ); @@ -85,7 +92,13 @@ KlamavConfigDialog::~KlamavConfigDialog() { } - +void KlamavConfigDialog::slotToggleClamdscan(bool on) +{ + m_klambackend->kcfg_ClamdMultiscan->setEnabled(on); + m_archivelimits->setEnabled(!on); + m_archivetypes->setEnabled(!on); + m_specialfiletypes->setEnabled(!on); +} /** Show page by object name */ void KlamavConfigDialog::showPage( const TQCString& page ) diff --git a/src/configdialog.h b/src/configdialog.h index 3100f20..8bb26af 100644 --- a/src/configdialog.h +++ b/src/configdialog.h @@ -40,10 +40,13 @@ class KlamavConfigDialog : public TDEConfigDialog void showPage( const TQCString& page ); + public slots: + void slotToggleClamdscan( bool on ); private: + bool clamdscan; - + class KlamBackend *m_klambackend; class ArchiveLimits *m_archivelimits; class ArchiveTypes *m_archivetypes; class SpecialFileTypes *m_specialfiletypes; diff --git a/src/klamav.cpp b/src/klamav.cpp index bf61432..dbe311c 100644 --- a/src/klamav.cpp +++ b/src/klamav.cpp @@ -284,7 +284,7 @@ void Klamav::slotScheduleScan() { klamscan->slotSchedule(); } void Klamav::slotOptions() { - slotConfigKlamav("Archive Limits"); + slotConfigKlamav("Scanning Backend"); } void Klamav::slotToggleWelcome() { diff --git a/src/klamavconfig.kcfg b/src/klamavconfig.kcfg index 420beeb..017730f 100644 --- a/src/klamavconfig.kcfg +++ b/src/klamavconfig.kcfg @@ -3,6 +3,24 @@ + + + + Use KlamAV without the ClamAV daemon. + true + + + + Use KlamAV with the ClamAV daemon. + false + + + + Force clamdscan to use multiscan mode (scan multiple directories at once in separate threads). May lower scanning time. + true + + + diff --git a/src/klamscan.cpp b/src/klamscan.cpp index 784398f..2a945e3 100644 --- a/src/klamscan.cpp +++ b/src/klamscan.cpp @@ -295,7 +295,7 @@ void Klamscan::slotAdvOptions(){ dialog->raise(); dialog->setActiveWindow();*/ - tdemain->slotConfigKlamav( "Archive Limits" ); + tdemain->slotConfigKlamav( "Scanning Backend" ); } diff --git a/src/scanviewer.cpp b/src/scanviewer.cpp index d61f4a4..0e5e702 100644 --- a/src/scanviewer.cpp +++ b/src/scanviewer.cpp @@ -39,9 +39,9 @@ ScanViewer::ScanViewer(TQWidget *parent, const char *name) : TQWidget(parent, name) { - scanInProgress = TRUE; - multiScan = FALSE; - + scanInProgress = TRUE; + multiScan = FALSE; + //TQGridLayout *layout = new TQGridLayout(this, 6, 3, 10, 4); layout = new TQGridLayout(this, 6, 3, 10, 4); layout->setColStretch(0, 10); @@ -53,9 +53,9 @@ ScanViewer::ScanViewer(TQWidget *parent, const char *name) layout->setRowStretch(2, 10); layout->addRowSpacing(4, 10); layout->setRowStretch(4, 0); - - - + + + resultview = new TQListView(this); resultview->setShowSortIndicator(true); @@ -77,24 +77,24 @@ ScanViewer::ScanViewer(TQWidget *parent, const char *name) menu = new TQPopupMenu( resultview ); - connect(resultview, SIGNAL( contextMenuRequested( TQListViewItem *, const TQPoint& , int ) ), + connect(resultview, SIGNAL( contextMenuRequested( TQListViewItem *, const TQPoint& , int ) ), this, SLOT( slotRMB( TQListViewItem *, const TQPoint &, int ) ) ); - + status_frame = new TQFrame(this); status_frame->setFrameStyle(TQFrame::Panel | TQFrame::Sunken); TQBoxLayout *status_layout = new TQHBoxLayout(status_frame, 2); - + status_label = new TQLabel("", status_frame); status_layout->addWidget(status_label, 10); - + //matches_label = new TQLabel(status_frame); //TQFontMetrics ml_fm(matches_label->fontMetrics()); //matches_label->setFixedWidth(ml_fm.width(i18n("9999 viruses/errors found"))); //matches_label->setFixedHeight(ml_fm.lineSpacing()); //status_layout->addWidget(matches_label, 0); - - + + status_layout->activate(); status_frame->adjustSize(); status_frame->setMinimumSize(status_frame->size()); @@ -103,7 +103,7 @@ ScanViewer::ScanViewer(TQWidget *parent, const char *name) status2_frame = new TQFrame(this); status2_frame->setFrameStyle(TQFrame::Panel | TQFrame::Sunken); status2_layout = new TQHBoxLayout(status2_frame, 2); - + status2_label = new TQLabel(i18n("Files scanned: 0"), status2_frame); status2_layout->addWidget(status2_label, 10); status2_label->hide(); @@ -135,7 +135,7 @@ ScanViewer::ScanViewer(TQWidget *parent, const char *name) matches2_label->setFixedWidth(ml_fm2.width(i18n("9999 viruses/problems found"))); matches2_label->setFixedHeight(ml_fm2.lineSpacing()); status2_layout->addWidget(matches2_label, 0); - + TQToolTip::add(matches2_label, i18n("cf. 'Flanderseses' - Homer Simpson. This childish joke will be removed when KlamAV is more mature.")); status2_layout->activate(); @@ -144,7 +144,7 @@ ScanViewer::ScanViewer(TQWidget *parent, const char *name) layout->addMultiCellWidget(status2_frame, 4, 4, 0, 2); - + layout->activate(); @@ -209,7 +209,7 @@ void ScanViewer::processOutput() filesscanned++; if (!(showProgress)) status2_label->setText(i18n("Files scanned: %1").arg(filesscanned)); - + //}else if ((pos = buf.section('\n',j,j).find("ERROR:")) != -1){ }else if ((pos = (item2.find("ERROR:"))) != -1){ TQString tmpVirusName = item2.mid((fnameEndPoint+1),(item2.length() - (fnameEndPoint+1))); @@ -241,7 +241,7 @@ void ScanViewer::processOutput() "- Access Denied!").arg(tmpFName)); CollectionDB::instance()->insertEvent("Error Found","Access Denied",tmpFName); //}else if ((pos = buf.section('\n',j,j).find(": Can't open")) != -1){ - + }else if ((pos = (item2.find(": Can't open"))) != -1){ //status2_label->setText(i18n("Files scanned: %1").arg(++filesscanned)); filesscanned++; @@ -280,9 +280,9 @@ void ScanViewer::processOutput() void ScanViewer::slotScan(const TQStringList & filepattern, int mode, bool recursive, bool dcopscan) { - //KMessageBox::information (this, filepattern); + //KMessageBox::information (this, filepattern); TDECmdLineArgs *args = TDECmdLineArgs::parsedArgs(); - + if(( args->isSet( "scanthis" ) ) || (dcopscan)) { calculateTime = FALSE; showProgress = FALSE; @@ -341,13 +341,16 @@ void ScanViewer::slotScan(const TQStringList & filepattern, int mode, bool recur //kdDebug() << filepattern << endl; prog->setTotalSteps(cnt); - kdDebug() << "COUNT" << cnt << endl; + kdDebug() << "COUNT" << cnt << endl; config = TDEGlobal::config(); + config->setGroup("KlamavBackend"); + clamdscan = config->readBoolEntry("ScannerClamdscan", false); + slotClear(); QuarantineList.clear(); - + errorsEncountered = FALSE; filesscanned = 0; //status2_label->setText(i18n("Scan in Progress...")); @@ -363,17 +366,17 @@ void ScanViewer::slotScan(const TQStringList & filepattern, int mode, bool recur db = *ita; } } - - ////kdDebug() << "here 2" << endl; + + ////kdDebug() << "here 2" << endl; TQString dbpath; TQString excludes; - TQString options; - + TQString options; // can not be used for clamdscan + if (!(db.isEmpty())) dbpath = TQString(" -d %1 ").arg(db); config->setGroup("Klamscan"); - + if (config->readEntry("ExcludeQuarantine") == "Yes"){ config->setGroup("Kuarantine"); TQStringList lastQuarLocations = config->readListEntry("KuarantineLocations"); @@ -384,7 +387,7 @@ void ScanViewer::slotScan(const TQStringList & filepattern, int mode, bool recur excludes += TQString(" --exclude=%1 ").arg(quarloc); } - + //if ((recursive_box->isChecked() && !(multiScan)) || (multi_recursive && multiScan)) if (recursive) options += " -r "; @@ -397,7 +400,7 @@ void ScanViewer::slotScan(const TQStringList & filepattern, int mode, bool recur // if (KlamavConfig::mBsToExtract() > 0) // options += "--max-space=" + TQString("%1").arg(KlamavConfig::mBsToExtract()) + " "; -// +// // if (KlamavConfig::compressionRatio() > 0) // options += "--max-ratio=" + TQString("%1").arg(KlamavConfig::compressionRatio()) + " "; @@ -410,7 +413,7 @@ void ScanViewer::slotScan(const TQStringList & filepattern, int mode, bool recur if (KlamavConfig::maxScanSize() > 0) options += "--max-scansize=" + TQString("%1").arg(KlamavConfig::maxScanSize()) + "M "; - + //config->setGroup("Klamscan"); // if (KlamavConfig::virusLimitsExceeded()) // options += "--block-max "; @@ -423,7 +426,7 @@ void ScanViewer::slotScan(const TQStringList & filepattern, int mode, bool recur if (!(KlamavConfig::scanHTML())) options += "--no-html "; - + if (!(KlamavConfig::scanPE())) options += "--no-pe "; @@ -449,7 +452,7 @@ void ScanViewer::slotScan(const TQStringList & filepattern, int mode, bool recur else options+=" "; } - + if (KlamavConfig::scanArj()){ options += "--arj"; if ((KlamavConfig::arjUsing()) != "") @@ -465,7 +468,7 @@ void ScanViewer::slotScan(const TQStringList & filepattern, int mode, bool recur else options+=" "; } - + if (KlamavConfig::scanLzh()){ options += "--lha"; if ((KlamavConfig::lzhUsing()) != "") @@ -506,21 +509,59 @@ void ScanViewer::slotScan(const TQStringList & filepattern, int mode, bool recur options+=" "; } - kdDebug() << "clamscan -v " - << excludes << " " - << dbpath << " " - << options << " " - << "'" + m_filepattern.join("' '") + "'" << endl; + if(clamdscan) { + // make sure that clamd is running + FILE* clamdpid; + if( clamdpid = fopen("/run/clamav/clamd.pid","r") ) + fclose(clamdpid); // it's ok + else { + int choice = KMessageBox::warningYesNoCancel( + this, + i18n("The ClamAV daemon does not seem to be running on this system. Do you really want to continue with this scan or would you like to launch a standalone scan instead?'"), + i18n("Clamd not running"), + i18n("Continue this scan"), + i18n("Launch standalone scan"), + i18n("Do not ask me again") + ); + + switch(choice) { + case 2: // cancel + return; + break; + case 4: // launch standalone scan + clamdscan = false; + break; + } + } + } childproc = new KProcIO(); childproc->setUseShell(TRUE); childproc->setUsePty (KProcIO::Stdout,TRUE); - *childproc << "clamscan -v "; - *childproc << excludes << " "; - *childproc << dbpath << " "; - *childproc << options << " "; - + if(clamdscan) { + config->setGroup("KlamavBackend"); + TQString multiscanOption = config->readBoolEntry("ClamdMultiscan", true) ? " -m " : ""; + + kdDebug() << "clamdscan -v " + << multiscanOption + << "'" + m_filepattern.join("' '") + "'" << endl; + + *childproc << "clamdscan -v "; + *childproc << multiscanOption; + } else { + kdDebug() << "clamscan -v " + << excludes << " " + << dbpath << " " + << options << " " + << "'" + m_filepattern.join("' '") + "'" << endl; + + *childproc << "clamscan -v "; + *childproc << excludes << " "; + *childproc << dbpath << " "; + *childproc << options << " "; + } + *childproc << "'" + m_filepattern.join("' '") + "'"; @@ -601,7 +642,7 @@ void ScanViewer::childExited() int status = childproc->exitStatus(); int result; - + status2_label->setText( i18n("Scan Complete") ); CollectionDB::instance()->insertEvent("Manual Scan",TQString("Scan Complete"),m_filepattern.join(" ")); @@ -743,7 +784,7 @@ void ScanViewer::Quarantine(){ KMessageBox::information (this,i18n("

There was a problem quarantining %1. Check your diskspace, the permissions on your quarantine location and whether a file with the same name already exists in the quarantine.

").arg(fname)); } - + } } if (allQuarantined) @@ -752,7 +793,7 @@ void ScanViewer::Quarantine(){ tdemain->_tray->setPixmap(KSystemTray::loadIcon("klamav_scan_found")); config->writeEntry(TQString("Items %1").arg(quarloc), lastQuarItems); config->sync(); - + //tdemain->kuarantine->refresh(); @@ -807,7 +848,7 @@ void ScanViewer::slotQuarantineSelected() TQPtrList list; TQListViewItemIterator it( resultview, TQListViewItemIterator::Selected ); - + QuarantineList = ""; while ( it.current() ) { TQListViewItem* tItem = it.current(); @@ -844,7 +885,7 @@ void ScanViewer::slotStartAgain() calculateTime = TRUE; emit scanStartingAgain(this); slotScan(m_filepattern, m_mode, m_recursive,false); - + } @@ -865,22 +906,22 @@ void ScanViewer::slotCancelScanTime() // void ScanViewer::startProgress() // { -// +// // cnt = 0; // //kdDebug() << "m_filepattern" << m_filepattern << endl; // TQDir d( m_filepattern ); // // int num = countFiles(d); // // if (countFiles(d) > 0) // // //kdDebug() << "count" << num << endl; -// +// // progress = new KProgressDialog (this, "progress", i18n( "Loading .." ), i18n( "Loading..." ), true); // progress->setAllowCancel(false); // prog = progress->progressBar(); // progress->setLabel(i18n( "Loading lots and lots and lots of virus information" )); // //int cnt = countFiles(d); // prog->setTotalSteps(countFiles(d)); -// //kdDebug() << "COUNT" << countFiles(d) << endl; -// +// //kdDebug() << "COUNT" << countFiles(d) << endl; +// // } int ScanViewer::countFiles( TQDir & root) @@ -894,15 +935,15 @@ int ScanViewer::countFiles( TQDir & root) } TQStringList entries = root.entryList( TQDir::Dirs | TQDir::Files | TQDir::Hidden); - - ////kdDebug() << "count" << counter << endl; + + ////kdDebug() << "count" << counter << endl; for (TQStringList::size_type j = 0; j < entries.size(); j++ ) { TQString entry = entries[j]; if( entry == "." || entry == "..") continue; - + TQFileInfo fi(root, entry ); entry = fi.absFilePath(); @@ -980,7 +1021,7 @@ void ScanViewer::slotOnItem( TQListViewItem * lineitem) status_label->setText( message); - + } void ScanViewer::slotOffItem( ) diff --git a/src/scanviewer.h b/src/scanviewer.h index fa85e6b..3114960 100644 --- a/src/scanviewer.h +++ b/src/scanviewer.h @@ -59,7 +59,7 @@ public: /** * Use this method to load whatever file/URL you have */ - + //void setDirName(TQString); void slotScan(const TQStringList & filepattern, int mode, bool recursive, bool dcopscan); void slotCancel(); @@ -128,6 +128,7 @@ private: void Quarantine(); void askUser(); int countFiles( TQDir & root); + TQString scanner; //void ScanViewer::startProgress(); TQLineEdit *template_edit; TQComboBox *files_combo, *pattern_combo, *check_combo; @@ -173,6 +174,7 @@ private: bool calculateTime; bool showProgress; TQFrame *status_frame; + bool clamdscan; }; #endif // _SCANVIEWER_H_ diff --git a/translations/messages/klamav.pot b/translations/messages/klamav.pot index 5e969d9..1ee945f 100644 --- a/translations/messages/klamav.pot +++ b/translations/messages/klamav.pot @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2021-01-30 18:34+0200\n" +"POT-Creation-Date: 2021-02-05 22:20+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -49,46 +49,54 @@ msgstr "" msgid "Multiple Directories Selected" msgstr "" +#: configdialog.cpp:66 +msgid "Backend" +msgstr "" + +#: configdialog.cpp:66 +msgid "Configure Scanning Backend" +msgstr "" + #: archivelimits.ui:16 archivelimits.ui:38 -#: archivetypes.ui:16 configdialog.cpp:63 +#: archivetypes.ui:16 configdialog.cpp:70 #, no-c-format msgid "Archive Limits" msgstr "" -#: configdialog.cpp:63 +#: configdialog.cpp:70 msgid "Configure Archive Limits" msgstr "" -#: archivetypes.ui:27 configdialog.cpp:64 klamscanoptions.cpp:201 +#: archivetypes.ui:27 configdialog.cpp:71 klamscanoptions.cpp:201 #, no-c-format msgid "Archive Types" msgstr "" -#: configdialog.cpp:64 +#: configdialog.cpp:71 msgid "Configure Archive Types" msgstr "" -#: configdialog.cpp:65 +#: configdialog.cpp:72 msgid "E-mail protection" msgstr "" -#: configdialog.cpp:65 +#: configdialog.cpp:72 msgid "Set up your e-mail client to use Klammail" msgstr "" -#: configdialog.cpp:66 +#: configdialog.cpp:73 msgid "File Types" msgstr "" -#: configdialog.cpp:66 +#: configdialog.cpp:73 msgid "Configure File Types" msgstr "" -#: configdialog.cpp:68 +#: configdialog.cpp:75 msgid "Event Logging" msgstr "" -#: configdialog.cpp:68 +#: configdialog.cpp:75 msgid "Configure Events to Log" msgstr "" @@ -539,7 +547,7 @@ msgstr "" msgid "Update Process Died Unexpectedly!" msgstr "" -#: freshklam.cpp:491 scanviewer.cpp:633 +#: freshklam.cpp:491 scanviewer.cpp:674 msgid "Unknown option passed." msgstr "" @@ -720,7 +728,7 @@ msgstr "" msgid "Welcome" msgstr "" -#: klamav.cpp:214 scanviewer.cpp:621 +#: klamav.cpp:214 scanviewer.cpp:662 msgid "Quarantine" msgstr "" @@ -958,11 +966,11 @@ msgid "" "your self." msgstr "" -#: kuarantine.cpp:640 kuarantine.cpp:646 scanviewer.cpp:798 +#: kuarantine.cpp:640 kuarantine.cpp:646 scanviewer.cpp:839 msgid "Search for %1 with Trend Micro" msgstr "" -#: kuarantine.cpp:641 kuarantine.cpp:647 scanviewer.cpp:800 +#: kuarantine.cpp:641 kuarantine.cpp:647 scanviewer.cpp:841 msgid "Search for %1 with Google" msgstr "" @@ -1025,7 +1033,7 @@ msgid "" msgstr "" #: scanviewer.cpp:211 scanviewer.cpp:224 scanviewer.cpp:233 scanviewer.cpp:239 -#: scanviewer.cpp:249 scanviewer.cpp:257 scanviewer.cpp:668 +#: scanviewer.cpp:249 scanviewer.cpp:257 scanviewer.cpp:709 #, c-format msgid "Files scanned: %1" msgstr "" @@ -1042,154 +1050,177 @@ msgstr "" msgid "Files scanned:" msgstr "" -#: scanviewer.cpp:563 +#: scanviewer.cpp:520 +msgid "" +"The ClamAV daemon does not seem to be running on this system. Do you really " +"want to continue with this scan or would you like to launch a standalone " +"scan instead?'" +msgstr "" + +#: scanviewer.cpp:521 +msgid "Clamd not running" +msgstr "" + +#: scanviewer.cpp:522 +msgid "Continue this scan" +msgstr "" + +#: scanviewer.cpp:523 +msgid "Launch standalone scan" +msgstr "" + +#: scanviewer.cpp:524 +msgid "Do not ask me again" +msgstr "" + +#: scanviewer.cpp:604 msgid "" "If viruses were found, you can right-click to quarantine selected files." msgstr "" -#: scanviewer.cpp:588 +#: scanviewer.cpp:629 msgid "Cancelled" msgstr "" -#: scanviewer.cpp:605 +#: scanviewer.cpp:646 msgid "Scan Complete" msgstr "" -#: scanviewer.cpp:612 +#: scanviewer.cpp:653 msgid "Scan Complete - No Viruses Found!" msgstr "" -#: scanviewer.cpp:614 +#: scanviewer.cpp:655 msgid "Scan Complete - No Viruses Found But Some Errors Encountered!" msgstr "" -#: scanviewer.cpp:621 +#: scanviewer.cpp:662 msgid "" "I'm going to quarantine this lot, you can restore them later if you want. If " "you don't want to quarantine, just press cancel." msgstr "" -#: scanviewer.cpp:621 +#: scanviewer.cpp:662 msgid "Quarantine Infected Files" msgstr "" -#: scanviewer.cpp:631 +#: scanviewer.cpp:672 msgid "Scan Complete - Viruses Found!" msgstr "" -#: scanviewer.cpp:635 +#: scanviewer.cpp:676 msgid "Database initialization error." msgstr "" -#: scanviewer.cpp:637 +#: scanviewer.cpp:678 msgid "Not supported file type." msgstr "" -#: scanviewer.cpp:639 +#: scanviewer.cpp:680 msgid "Can't open directory." msgstr "" -#: scanviewer.cpp:641 +#: scanviewer.cpp:682 msgid "Can't open file. (ofm)" msgstr "" -#: scanviewer.cpp:643 +#: scanviewer.cpp:684 msgid "Error reading file. (ofm)" msgstr "" -#: scanviewer.cpp:645 +#: scanviewer.cpp:686 msgid "Can't stat input file / directory." msgstr "" -#: scanviewer.cpp:647 +#: scanviewer.cpp:688 msgid "Can't get absolute path name of current working directory." msgstr "" -#: scanviewer.cpp:649 +#: scanviewer.cpp:690 msgid "I/O error, please check your filesystem." msgstr "" -#: scanviewer.cpp:651 +#: scanviewer.cpp:692 msgid "Can't get information about current user from /etc/passwd." msgstr "" -#: scanviewer.cpp:653 +#: scanviewer.cpp:694 msgid "" "Can't get information about user 'clamav' (default name) from /etc/passwd." msgstr "" -#: scanviewer.cpp:655 +#: scanviewer.cpp:696 msgid "Can't fork." msgstr "" -#: scanviewer.cpp:657 +#: scanviewer.cpp:698 msgid "Can't create temporary files/directories (check permissions)." msgstr "" -#: scanviewer.cpp:659 +#: scanviewer.cpp:700 msgid "Can't write to temporary directory (please specify another one)." msgstr "" -#: scanviewer.cpp:661 +#: scanviewer.cpp:702 msgid "Can't allocate and clear memory (calloc)." msgstr "" -#: scanviewer.cpp:663 +#: scanviewer.cpp:704 msgid "Can't allocate memory (malloc)." msgstr "" -#: scanviewer.cpp:665 +#: scanviewer.cpp:706 msgid "Unspecified Error!" msgstr "" -#: scanviewer.cpp:693 +#: scanviewer.cpp:734 msgid "0 viruses/problems found" msgstr "" -#: scanviewer.cpp:743 +#: scanviewer.cpp:784 msgid "" "

There was a problem quarantining %1. Check your diskspace, the " "permissions on your quarantine location and whether a file with the same " "name already exists in the quarantine.

" msgstr "" -#: scanviewer.cpp:930 +#: scanviewer.cpp:971 msgid "Please Wait" msgstr "" -#: scanviewer.cpp:967 +#: scanviewer.cpp:1008 msgid "Attempts to scan " msgstr "" -#: scanviewer.cpp:967 +#: scanviewer.cpp:1008 msgid " resulted in exceeding a limit you set in 'Archive Limits'." msgstr "" -#: scanviewer.cpp:969 +#: scanviewer.cpp:1010 msgid " contains the ClamAV test signature. It's not a virus." msgstr "" -#: scanviewer.cpp:971 +#: scanviewer.cpp:1012 msgid " is a damaged exectuable. Some viruses use this to conceal themselves." msgstr "" -#: scanviewer.cpp:973 +#: scanviewer.cpp:1014 msgid " has a form of zip compression sometimes used by viruses." msgstr "" -#: scanviewer.cpp:975 +#: scanviewer.cpp:1016 msgid " is an encrypted zip file." msgstr "" -#: scanviewer.cpp:977 +#: scanviewer.cpp:1018 msgid " is an encrypted RAR file." msgstr "" -#: scanviewer.cpp:979 +#: scanviewer.cpp:1020 msgid " is mis-formatted in a way sometimes used by viruses." msgstr "" -#: scanviewer.cpp:990 +#: scanviewer.cpp:1031 msgid "" "Hover over each entry for more info. Right-click on entries for more options." msgstr "" @@ -1280,23 +1311,23 @@ msgstr "" msgid "Once only" msgstr "" -#: sigtool.cpp:33 +#: sigtool.cpp:34 msgid "Email Client" msgstr "" -#: sigtool.cpp:49 +#: sigtool.cpp:50 msgid "Choose your email client:" msgstr "" -#: sigtool.cpp:65 +#: sigtool.cpp:66 msgid "Configure Automatically" msgstr "" -#: sigtool.cpp:69 +#: sigtool.cpp:70 msgid "Tell me how to do it" msgstr "" -#: sigtool.cpp:84 +#: sigtool.cpp:85 msgid "" "This will help you configure your email client to scan incoming and outgoing " "mail with KlamAV. Not all mail clients are fully supported yet. Infected " @@ -1304,27 +1335,27 @@ msgid "" "telling you the name of the virus and other relevant details." msgstr "" -#: sigtool.cpp:86 +#: sigtool.cpp:87 msgid "Notes" msgstr "" -#: sigtool.cpp:130 +#: sigtool.cpp:131 msgid "Please ensure KMail is not open before we proceed." msgstr "" -#: sigtool.cpp:152 +#: sigtool.cpp:153 msgid "" "You're already set up! Sure you haven't already configured KMail for KlamAV " "scanning?" msgstr "" -#: sigtool.cpp:200 +#: sigtool.cpp:201 msgid "" "I've set up the filters as the last two in your KMail filter list. You might " "want to open Kmail up and take a look." msgstr "" -#: sigtool.cpp:206 +#: sigtool.cpp:207 msgid "" "Mail scanning support is provided by a program called 'klammail'. This was " "installed automatically as part of the KlamAV installation. To use this " @@ -1336,7 +1367,7 @@ msgid "" "the virus and who the mail is from." msgstr "" -#: sigtool.cpp:215 +#: sigtool.cpp:216 msgid "" "Mail scanning support is provided by a program called 'klammail'. This was " "installed automatically as part of the KlamAV installation. To use this " @@ -1409,13 +1440,13 @@ msgstr "" msgid "Maximum MBs of Files to Scan" msgstr "" -#: archivelimits.ui:84 klamavconfig.kcfg:23 +#: archivelimits.ui:84 klamavconfig.kcfg:41 #, no-c-format msgid "Maximum Number of Files to Extract" msgstr "" -#: archivelimits.ui:114 klamavconfig.kcfg:13 -#: klamavconfig.kcfg:18 +#: archivelimits.ui:114 klamavconfig.kcfg:31 +#: klamavconfig.kcfg:36 #, no-c-format msgid "Maximum MBs to Extract" msgstr "" @@ -1520,6 +1551,40 @@ msgstr "" msgid "Alt+W" msgstr "" +#: backend.ui:16 backend.ui:27 +#, no-c-format +msgid "Scanning Backend" +msgstr "" + +#: backend.ui:38 klamavconfig.kcfg:8 +#, no-c-format +msgid "Standalone scanner" +msgstr "" + +#: backend.ui:49 klamavconfig.kcfg:18 +#, no-c-format +msgid "Force Multiscan mode" +msgstr "" + +#: backend.ui:60 klamavconfig.kcfg:13 +#, no-c-format +msgid "ClamAV daemon" +msgstr "" + +#: backend.ui:76 +#, no-c-format +msgid "" +"Here you can choose the backend you'd like to use with KlamAV.\n" +"

Standalone scanner uses the 'clamscan' command to perform a scan. " +"This backend is configurable via KlamAV, but takes longer to start. This " +"backend is also the easiest to set up, as it does not require running a " +"system-wide daemon.

\n" +"

ClamAV daemon uses the 'clamdscan' command to perform a scan. This " +"backend depends on a running instance of the clamd daemon and depends " +"on the options of the daemon. This backend starts up faster and also makes " +"use of the Multiscan feature.